7

友よ、これらのコードを asp.net で書くと、次のようなエラーが発生します。

このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります

お願い助けて

SqlConnection con = obj.getcon();
con.Open();

       SqlCommand cmd = new SqlCommand("select student_id from student_details", con);
       SqlDataReader dr = cmd.ExecuteReader();
       while (dr.Read())
       {
           String ss=dr[0].ToString();
           if (val == ss)
           {



               SqlCommand cmd1 = new SqlCommand("insert student_vs_testsession_details(student_id,testsession_id,testsession_status) values('" + val + "','" + Test + "','')", con);
               int val1 = cmd1.ExecuteNonQuery();


           }
           else
           {


               string message = "<script language=JavaScript> alert('StudentID does not exists!'); </script>";
               if (!Page.IsStartupScriptRegistered("clientScript"))
               {
                   Page.RegisterStartupScript("clientScript", message);
               }
           }

       } 
     dr.Close();
      // con.Close();

    }
4

3 に答える 3

17

接続文字列を変更して、このオプションを追加する必要があります

 "MultipleActiveResultSets=True;"

SQL Server 2005 以降では、MARS オプションがあります。
MARS では、開いている1 つの接続で、一度に複数のコマンドを処理できます。したがって、たとえば、接続文字列は次のようになります

"Server=myServerAddress;" + 
"Database=myDataBase;" + 
"Trusted_Connection=True;" +
"MultipleActiveResultSets=true;"

MARS のドキュメントを参照してください

「通常の」構成では、SqlDataReaderが開いている場合、SqlConnection はリーダーにサービスを提供するためにビジーであり、他のコマンドを受け入れることができません。
(SqlDataReader へのリンクの備考を参照してください)。

上記のコードでは、同じ接続を使用してコマンドを発行しようとすると、リーダーが開かれます。
DataSet に入力してからループするなどの回避策があります (ただし、大規模なセットの場合、これはパフォーマンスに影響します)。そのため、Microsoft の SQL チームは MARS を導入しました。

于 2013-04-08T09:45:16.930 に答える
-1

データリーダーがオンになっている間、同じ接続に対して複数のコマンド ステートメントを実行することはできません...代わりに SqlDataAdapter を使用してください。 dataadapter と DataSet を使用すると、作業がより簡単になります。

于 2013-04-08T09:46:06.027 に答える