构建c#3层项目 - 数据库处理问题

时间:2013-12-24 07:35:19

标签: c# 3-tier

我必须创建一个c#应用程序,我希望它会变得非常大,所以我想从良好的设置开始。 因为我主要使用PHP并且自从我编写C#应用程序以来已经很长时间了,所以我遇到了一些我无法理解的问题,因为我可以在网上找到各种信息和不好的例子。

我已经建立了一个包含表单,业务逻辑类和数据类的3层结构。 我还有一个数据库类来执行数据库操作。

我应该如何处理数据库连接?我现在通过打开连接并在crud操作中关闭它来获取它们在Database类本身中(get,insert,delete,...)

我基于这篇文章: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");
   }
}

数据库类的片段:

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();
            }
        }
}

1 个答案:

答案 0 :(得分:0)

数据库连接的一般做法是"获取延迟,早期发布"。这是因为数据库连接是宝贵的资源,我们不想不必要地抓住它们。

您对Database类的实现看起来很干净,您可以轻松地支持两种方式,即实例化和调用每个调用或具有全局变量。就个人而言,我更愿意并建议每次通话使用它。

您可能需要考虑在数据库类中实现IDisposable。