从 SqlDataReader 访问命令对象

本文关键字:对象 命令 访问 SqlDataReader | 更新日期: 2023-09-27 18:34:08

有一个SqlDataReader对象,我正在尝试获取其相关命令的超时。例如,我正在使用它来创建我的SqlDataReader

  SqlCommand myCommand = new SqlCommand(query, some_connection);
  _reader = myCommand.ExecuteReader();

在使用可视化调试器的运行时,我可以使用以下命令访问它:

 _reader.Command.CommandTimeout // Visual debugger 

不,我如何在代码中访问此"属性"(我想将其公开为第三方库的属性)?

背景

正在从第三个图书馆访问阅读器,所以实际上我只能访问阅读器。我的问题是了解为什么我可以在调试器中访问该命令而不是作为属性访问?幕后机制是什么,一些属性延伸,反思?

从 SqlDataReader 访问命令对象

你将需要使用反射来获取Command属性,因为它设置为internal访问。这是调试器用来显示属性的内容。

PropertyInfo prop = _reader.GetType().GetProperty("Command",
    BindingFlags.NonPublic | BindingFlags.Instance);
DbCommand cmd = (DbCommand)prop.GetValue(_reader);
int timeout = cmd.CommandTimeout;

附言您不应该真的对第三方组件进行单元测试 - 这就像说"我不相信 .NET 框架可以完成它的工作,所以我会在内部检查它所做的一切"。如果要对其进行测试,请将单元测试放在第三方解决方案中。

我建议为SqlCommand和SqlConnection提供一个外观(包装器)。然后将此对象传递给第三方库。

public class MyOwnReader : IDisposable
{
    bool isDisposed = false;
    SqlConnection _connection;
    SqlCommand _command;

    // You can expose the whole command, or specific property of the command
    public SqlCommand Command
    {
        get
        {
            return _command;
        }
    }

    public MyOwnReader(string connectionString)
    {
        _connection = new SqlConnection(connectionString);
        _connection.Open();
        _command = new SqlCommand();
        _command.Connection = _connection;
        _command.CommandType = CommandType.StoredProcedure; //example initialization
    }
    public void Dispose()
    {
        if (!isDisposed)
        {
            _connection.Dispose();
            _command.Dispose();
            isDisposed = true;
        }
    }
    public SqlDataReader ExecuteReader()
    {
        return _command.ExecuteReader();
    }
}