1

私は次のクラスを持っています:

public class Data
{
    static public SqlDataReader ExecutSql(string sql)
    {
        var cmd = new SqlCommand(sql, SqlCon.Conn);
        var data = cmd.ExecuteReader();
        return data;
    }
}

asp.net Webページから呼び出され、「このコマンドに関連付けられた開いているDataReaderが既にあり、最初に閉じる必要があります」というエラーが表示されます。

明らかに、データリーダーを実行する直前に新しいSqlCommandをインスタンス化しています。私はWeb開発に不慣れです(私のバックグラウンドはWinFormsです)が、それでも、文字通り作成されたばかりのコマンドに関連付けられたオープンDataReaderをすでに持つことができる方法を理解できませんか?マルチスレッドのような問題かどうかは理解できたかもしれませんが、デバッガーでコードをステップ実行しているため、このエラーが発生します。

誰かが私がここで欠けているものを教えてくれませんか?

4

3 に答える 3

3

以前にこのメソッドを呼び出しましたか? あなたのメソッドは SqlDataReader を返していますが、それが適切に閉じられているかどうかわかりません. msdn に従って

関連する SqlConnection を他の目的で使用するには、SqlDataReader を使い終わったら、Close メソッドを明示的に呼び出す必要があります。

リーダーからデータを読み取り、リーダーを閉じて、新しいタイプ (DataTable / DataSet またはプロパティで満たされたカスタム クラス) を返すことをお勧めします。

using(SqlCommand command =new SqlCommand(sql, SqlCon.Conn))
{
   SqlDataReader reader = command.ExecuteReader();
   while (reader.Read())
   {
     //Fill your object and then use that to return
   }
}
于 2012-04-20T02:54:49.980 に答える
1

SqlDataReader ExecutSql(string sql) メソッドを正確に呼び出すのはいつですか? ページロード時ですか?その場合、asp.net では、ページでイベントが発生するたびにページの読み込みが呼び出されるためです。これを防ぐには、次を使用できます。

if(!Page.IsPostBack)
{
    //call SqlDataReader ExecutSql(string sql)
}

これにより、ページを開いてロードするときに、上記のメソッドが 1 回だけ呼び出されるようになります。イベントによるポストバックの場合、このメソッドは呼び出されません。

于 2012-04-20T06:09:19.603 に答える
0

接続文字列でMARSを有効にすることもできます。

于 2012-04-21T00:00:21.023 に答える