c# - 将 SqlDataReader 用作资源的习惯用法

标签 c# .net sql sql-server

this 开始问题,我发现自己一遍又一遍地编写以下代码:

SqlCommand command = new SqlCommand();
// Code to initialize command with what we want to do
using (SqlConnection connection = openConnection())
{
    command.Connection = connection;
    using (SqlDataReader dataReader = thisCommand.ExecuteReader())
    {
        while (dataReader.Read())
        {
            // Do stuff with results
        }
    }
}

必须嵌套两个 using 语句是相当乏味的。有没有办法告诉 SqlDataReader 它拥有命令,并告诉命令它拥有连接?

如果有办法做到这一点,那么我可以编写一个可以像这样调用的辅助方法:

// buildAndExecuteCommand opens the connection, initializes the command
// with the connection and returns the SqlDataReader object. Dispose of the
// SqlDataReader to dispose of all resources that were acquired
using(SqlDataReader reader = buildAndExecuteCommand(...))
{
    // Do stuff with reader
}

还是我必须硬着头皮在 SqlDataReader 上编写自己的包装器?

最佳答案

一件事是编写一个为您处理的方法,将每个结果回调到一个委托(delegate)中。例如:

using (SqlConnection connection = openConnection())
{
    command.Connection = connection;
    ExecuteReaderWithCommand(command, reader =>
    {
        // Do stuff with the result here.
    });
}

然后 ExecuteReaderWithCommand 会是这样的:

public static void ExecuteReaderWithCommand(SqlCommand command,
    Action<SqlDataReader> action)
{
    using (SqlDataReader dataReader = thisCommand.ExecuteReader())
    {
        while (reader.Read())
        {
            action(reader);
        }
    }
}

如果您愿意,可以将其作为 SqlCommand 的扩展方法。哎呀,如果你愿意的话,你也可以去城里让它为你打开连接……你越能抽象出“打开/使用/关闭”的想法,就越好。

关于c# - 将 SqlDataReader 用作资源的习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1063095/

相关文章:

c# - 使用 "OPENSSH"私钥文件在 C# 中的 SSH.NET 字符串中失败, "invalid private key file"

javascript - Highcharts 在 x 轴中显示错误的月份值

sql - 如何使用 TSQL 在 While 循环中增加 NVarchar 值?

sql - 通过sql View 向多个表中插入数据

c# - 从 Web 浏览器文档中的 JavaScript 调用 C# 代码

sql - TSQL 返回存在的内容

c# - 使用 DDay ical library 时,如何表示忙碌、空闲和不在办公室?

c# - 如何让 JObject.FromObject(object) 包含类型信息?

c# - Visual Studio/C# 自动格式化。我可以控制属性后的换行符吗

c# - 如何创建可以处理或转换未知类型的 lambda 表达式?