0

sqldatareaderからデータを読み取っているときに、「リーダーが閉じているときにReadを呼び出そうとして無効になりました」というエラーが表示されます。私のコードは以下の通りです

明らかに、これはExecSqlDataReaderのusingステートメントによって閉じられています

このメソッドを呼び出してから別のクラスでリーダーを使用できるようにしたいのですが、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;

    }
4

2 に答える 2

5

問題は、(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によって接続が存続するため、これは機能するはずです。

于 2012-11-01T23:28:59.803 に答える
0

DataTableおそらく、接続を開いたままにしようとするのではなく、(切断された)を返すように設計を変更する必要があります(そうすると「リーク」する可能性があります)。

于 2012-11-01T23:29:01.770 に答える