2013-12-24 4 views
1

Мне нужно создать приложение C#, которое, как я ожидаю, будет расти довольно крупным, поэтому я хочу начать с хорошей настройки. Потому что я в основном использую PHP, и это было очень долгое время с тех пор, как я написал приложение C#, у меня возникли некоторые проблемы, из-за которых я не могу оторвать голову из-за различной информации и плохих примеров, которые я могу найти в Интернете.Построение проекта C# 3-уровня - проблемы с обработкой базы данных

Я создал трехуровневую структуру, имеющую форму, класс бизнес-логики и dataclass. У меня также есть база данных для выполнения операций с базой данных.

Как я должен обрабатывать привязки данных? Теперь я справиться с ними в самом классе базы данных путем открытия соединения и его закрытия в операции CRUD (получить, вставка, удаление, ...)

Я основан себя на этой статье: http://www.codeproject.com/Articles/36847/Three-Layer-Architecture-in-C-NET Это хороший один?

Я немного смущен, потому что в PHP я открываю свое соединение в начале моей страницы, используя новый экземпляр, где конструктор немедленно предоставляет соединение. В C# Я вижу много открытий и закрытий для каждого запроса?

frmUsers (пользователи формируют)

private void btnListUsers_Click(object sender, EventArgs e) 
{ 
    UsersBLL usersbll = new UsersBLL(); 
    DataTable dtUsers = usersbll.getUsers(); 
} 

UsersBLL (бизнес-логика класс)

class UsersBLL 
{ 
    private DataUsers du; 
    public UsersBLL() 
    { 
     du = new DataUsers(); 
    } 
    public DataTable getUsers() 
    { 
     return du.getUsers(); 
    } 
} 

DataUsers (класс данных)

public class DataUsers 
{ 
    private Database db; 

    public DataUsers() 
    { 
     db = new Database(); 
    } 
    public DataTable getUsers() 
    { 
     return db.get("select * from users"); 
    } 
} 

Отрывок из класса Database:

class Database 
{ 
     private iDB2Connection cn; 


     public Database(){ 
      cn = new iDB2Connection(ConfigurationManager.ConnectionStrings["iseries"].ToString()); 
     } 

     public void openConnection() 
     {  
      cn.Open(); 
     } 

     public void closeConnection() 
     { 
      if (cn != null) 
      { 
       cn.Close(); 
       cn.Dispose(); 
      } 
     } 
     public DataTable get(String query) 
     { 
      try 
      { 
       openConnection(); 
       iDB2Command cmd = cn.CreateCommand(); 
       cmd.CommandText = query; 
       iDB2DataAdapter da = new iDB2DataAdapter(cmd); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 
       return ds.Tables[0]; 
      } 
      finally 
      { 
       closeConnection(); 
      } 
     } 
} 
+0

Вам необходимо провести реорганизацию класса базы данных. Используйте выражение 'using' вместо того, чтобы полагаться на try-catch-finally. Подробнее читайте здесь: http://blogs.msdn.com/b/angelsb/archive/2004/10/08/240123.aspx и здесь: http://www.sqlnotes.info/2012/02/01/few- вещи-о-пул-соединения/и здесь: http://stackoverflow.com/questions/8649096/open-connection-before-every-single-nonquery-or-one-connection-for-the-whole – Abhitalks

+0

Вы посмотрели в ORM, например, «NHibernate», «Entity Framework» или «Linq2Sql»? Я бы очень помог вашему «слою базы данных». – hatcyl

+0

Я бы с удовольствием использовал один из них, но мы используем базу данных db2 на iSeries, и установить ее с ORM не так просто. – randomizer

ответ

0

Общая практика для подключения к базам данных является "Приобретать Late, выйдет в начале". Это связано с тем, что соединения с базой данных - это ценные ресурсы, и мы не хотим поддерживать их без необходимости.

Ваша реализация класса базы данных выглядит чистой, и вы можете легко поддерживать оба способа, то есть создавать и вызывать каждый вызов или иметь глобальную переменную. Лично я предпочту и рекомендую использовать его для каждого звонка.

Возможно, вы захотите рассмотреть возможность внедрения IDisposable в свой класс базы данных.