gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:22 25 4
gpt4 key购买 nike

我正在尝试进行通用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com