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