我们有一个SQL实用程序类,它将存储过程的名称作为其输入参数,并返回datatable中的结果。这背后的原因是,我们不必担心忘记关闭连接和连接泄漏。此外,我们还可以通过在数据访问层中重新创建数据适配器和数据存储器来减少代码。
我遇到的问题是,我们正在填充datatable,这样我们就可以循环使用它来创建对象,所以我们基本上是像使用数据中心一样使用它。我读过一些类,这些类将返回数据存储程序或数据适配器。但问题是客户端必须打开和关闭连接,或者必须在Finalize方法中关闭连接。您似乎不希望垃圾收集负责关闭数据库连接。
总之,我们希望有一个类,这样我们就可以减少代码,因为我们不必为每个查询创建数据区,这样我们就可以确保数据库连接被关闭。
处理这件事的最佳方法是什么?
更新:仍然在考虑这个问题,但到目前为止,最佳实践似乎仍然是返回一个数据中心,使用CommandBehavior.CloseConnection,然后信任谁曾经使用这个类调用dr.Close()?
发布于 2009-10-21 19:45:03
你有没有考虑过微软企业图书馆
public List<User> GetUsers()
{
List<User> result = new List<User>();
Database db = new
Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase(this.connectionString);
DbCommand cmd = db.GetStoredProcCommand("GetUsers");
using (IDataReader rdr = db.ExecuteReader(cmd))
{
while (rdr.Read())
{
User user = new User();
FillUser(rdr, user);
result.Add(user);
}
}
return result;
}发布于 2009-10-21 19:50:40
我们使用这样的东西,它在大容量下表现很好。
public SqlDataReader ExecuteReader(string command, SqlParameter[] parameters)
{
SqlDataReader reader = null;
using (SqlConnection conn = new SqlConnection())
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = command;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
return reader;
}DataTables没有被认为是最佳实践,原因有几个,包括它们的膨胀和缺乏类型安全性。
发布于 2009-10-21 18:29:04
我有相同的结构--具有获取数据并返回填充DataTables的方法的实用程序类(或填充/更新传递给它们的DataTable )--原因完全相同:将数据库连接与代码的其余部分分开,并确保它们仅在需要和关闭时才被打开。特别是由于数据存储在各种后端系统中,而且我只想向我的应用程序提供一个接口,而不是让它担心细节。
您的情况有一个不同:我们(通常)不从DataTables中的行创建对象,而是直接处理行中的数据。我发现使用DataTables工作简单而高效。
除此之外,我个人不认为这种方法有什么问题,并发现它对我们的目的非常有效。
https://stackoverflow.com/questions/1602043
复制相似问题