sqldatareader错误“读取器关闭时无效尝试调用读取。”

时间:2012-11-01 23:22:14

标签: c#

当我从sqldatareader读取数据时,我收到错误“读取器关闭时无效尝试调用Read”。  我的代码在

之下

显然,这是由ExecSqlDataReader

中的using语句关闭的

我希望能够调用此方法,然后在另一个类中使用reader,是否有任何方法可以在ExecSqlDataReader方法中循环遍历SqlDataReader?

希望有意义

感谢

代码:

SqlDataReader reader = data.ExecSqlDataReader(1);
 while (reader.Read())
  {
   .....
  }


       public SqlDataReader ExecSqlDataReader(int queryType = 0)
       {
        using (var conn = new SqlConnection(this.ConnectionString))
        {
            try
            {
                PrepareCommandForExecution(conn, queryType);
                return _cmd.ExecuteReader();

            }
            finally
            {
                _cmd.Connection.Close();
            }
        }
    }

    private SqlCommand PrepareCommandForExecution(SqlConnection conn, int sqlType = 0)
    {

            _cmd.Connection = conn;
            switch (sqlType)
            {
                case 0:
                    _cmd.CommandType = CommandType.StoredProcedure;
                    break;
                case 1:
                    _cmd.CommandType = CommandType.Text;
                    _cmd.CommandText = _tSqltext;
                     break;
                case 2:
                    _cmd.CommandType = CommandType.TableDirect;
                    break;
            }

            _cmd.CommandTimeout = this.CommandTimeout;
            _cmd.Connection.Open();

            return _cmd;

    }

2 个答案:

答案 0 :(得分:4)

问题是离开函数(通过return语句)会将你踢出using块,因此你正在使用的SqlDataReader和SqlConnections被释放出来。要解决此问题,请尝试更改函数签名,如下所示:

public static IEnumerable<IDataRecord> ExecSqlDataReader( int queryType )

然后像这样更新函数的中间部分:

using ( var reader = cmd.ExecuteReader() )
{
    while ( reader.Read() )
    {
        yield return reader;
    }
}

如何使用它:

var first10 = ExecSqlDataReader(0).Take(10);
foreach (var rec in first10)
{
    int ID = rec.GetInt32(0);
}

所以这应该有效,因为yield会导致Connection保持活动状态:

答案 1 :(得分:0)

您应该修改您的设计以传回(断开连接的)DataTable而不是尝试保持连接打开(然后可能会“泄漏”)。