【发布时间】:2019-03-02 16:28:11
【问题描述】:
我正在尝试对我的 Sql 客户端对象调用进行分层,以便可靠地处理它们。像这样的:
打开数据库连接 -> 创建命令 -> 读取结果 -> 关闭 命令 -> 关闭数据库连接
到目前为止,当我用相同的方法完成所有这些事情时,这已经成功了。
问题是这很容易出错。还有一团糟。
当我尝试创建一个通用方法来处理这个清理所有内容并返回阅读器时,连接在阅读器启动之前关闭。
//closes connection before it can be read...apparently the reader doesn't actually have any data at that point ... relocating to disposable class that closes on dispose
public SqlDataReader RunQuery(SqlCommand command)
{
SqlDataReader reader = null;
using (var dbConnection = new SqlConnection(_dbConnectionString))
{
try
{
dbConnection.Open();
command.Connection = dbConnection;
reader = command.ExecuteReader(); // connection closed before data can be read by the calling method
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
dbConnection.Close();
}
}
return reader;
}
我可以通过创建自己的实现 IDispose(等)的类来解决这个问题,但是当我用相同的 using 语句包装它时,它占用的行数与数据库连接 using 语句一样多。
如何在一个可重复的类中处理数据库连接,该类处理所有这些工件并关闭连接?
【问题讨论】:
-
您要读取什么样的数据?它可以存储在列表或字典中吗?
-
@KevinK。是的,我可以。有时我只返回一件东西,但它可以放在一个列表中。
-
您应该在关闭连接之前关闭阅读器。所以你应该在收到数据后处理所有的对象。
-
@Eugene:谢谢。这就是我所怀疑的......所以没有办法制作一个可重用的方法来隐藏所有/大部分嵌套的 using 语句?
-
我会设计解决方案,它会读取里面的所有日期并返回数据集。如果不可能,您可以尝试不同的方法来访问数据。例如 LINQ
标签: c# sql-server dispose idisposable sqlconnection