c# - 在以不同方法创建的对象上使用

标签 c# using

我正在尝试进行通用 SQL 调用,这让我想到了一个有趣的问题。我有一个执行 SQL 并返回 SQLDataReader 的方法。

    private SqlDataReader ExecuteSql(SqlCommand command)
    {
        using (var connection = new SqlConnection(ConnectionText, Credentials))
        {
            command.Connection = connection;
            connection.Open();
            return command.ExecuteReader();
        }
    }

调用命令获取读取器并正确处理返回的数据。但是,知道需要处理 reader,我将其包含在 using 语句中。

        using (SqlDataReader reader = ExecuteSql(command))
        {
            while (reader.Read())
            {
                try { ... }
                catch(Exception e) { ... }
            }
        }

我认为 Dispose 应该在 using 语句末尾的 SqlDataReader 上调用,尽管它是在代码中创建的。但是,我无法找到任何具体证实这一点的内容。

概括地说,using 语句是否可以成功地用于在代码中其他地方创建的对象?

附带说明一下,我确实意识到,如果 SqlDataReader 是在 ExecuteSql 方法中创建为对象而不是直接返回,那么可能存在问题它在 ExecuteSql 方法中抛出异常并且未被处理。

最佳答案

您可以像这样传递一个 Action 来完成此操作:

private void ExecuteSql(SqlCommand command, Action<SqlDataReader> action)
{
    using (var connection = new SqlConnection(ConnectionText, Credentials))
    {
        command.Connection = connection;
        connection.Open();
        using (var reader = command.ExecuteReader())
        {
            action(reader);
        }
    }
}

然后是调用函数:

var myCommand = //...

int id;

ExecuteSql(myCommand, (reader) => {
  id = reader.GetInt32(0);
});

现在任何调用者都不需要知道他们是否必须处理它,并且您的连接将在该方法在读取器上完成后处理。

关于c# - 在以不同方法创建的对象上使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58564041/

相关文章:

c# - 如何确定调用方法和类名?

c# - 在 VS 2017 中插入 Intellisense 的简化 Using 语句

linq - 在 LINQ-SQL 中,将 DataContext 包装为一个 using 语句 - 优点 缺点

c++ - CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc

asp.net-mvc-3 - 在 Razor View 中与通用方法一起使用

c# - 如何使用 Html.GetUnobtrusiveValidationAttributes()

c# - 重新启动由 C# 控制台应用程序托管的 WCF 服务

c# - HttpWebRequest PATCH 方法和 JSON 给出 Bad Request

c# - SWIG 更改 C# 特定类型字段的类型

c++ - 别名定义来自私有(private)子结构的静态成员