我必须创建一个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();
}
}
}
答案 0 :(得分:0)
数据库连接的一般做法是"获取延迟,早期发布"。这是因为数据库连接是宝贵的资源,我们不想不必要地抓住它们。
您对Database类的实现看起来很干净,您可以轻松地支持两种方式,即实例化和调用每个调用或具有全局变量。就个人而言,我更愿意并建议每次通话使用它。
您可能需要考虑在数据库类中实现IDisposable。