2

同じコードで SQLCommand の同じインスタンスを複数回使用できないのはなぜですか?

ここでコードを試してみましたが、グリッドビューでうまく動作しますが、cmd.CommandText()メソッドを使用してクエリを変更すると、次のように言い続けます:

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

これはコードです:

string cs = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString;
SqlConnection con = new SqlConnection(cs);

try
{
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    con.Open();
    cmd.CommandText = "Select top 10 FirstName, LastName, Address, City, State from Customers";

    GridView1.DataSource = cmd.ExecuteReader(); 
    GridView1.DataBind();


    cmd.CommandText = "SELECT TOP 10 COUNT(CreditLimit) FROM Customers";
    int total = (int)cmd.ExecuteScalar();
    TotalCreditLble.Text = "The total Credit :" + total.ToString();

}
catch(Exception exp)
{
    Response.Write(exp.Message);
}
finally
{
    con.Close();
}
4

3 に答える 3

5

問題は、コマンドSqlCommandを介してオブジェクトを使用して DataReader を生成していることです。command.ExecuteReader()それが開いている間、コマンドを再利用することはできません。

これはうまくいくはずです:

using (var reader = cmd.ExecuteReader())
{
    GridView1.DataSource = reader;
    GridView1.DataBind();
}
//now the DataReader is closed/disposed and can re-use command
cmd.CommandText = "SELECT TOP 10 COUNT(CreditLimit) FROM Customers";
int total = (int)cmd.ExecuteScalar();
TotalCreditLble.Text = "The total Credit :" + total.ToString();
于 2013-11-14T18:32:01.440 に答える
0

ブロックの使用について話している人たちに感謝します!ビデオの例で見たこのコードが正常に機能する理由! SqlCommand の同じインスタンスを使用し、SqlCommand の同じインスタンスでメソッド CommanText を使用して異なるクエリを渡すのと同じことであり、問​​題なく実行されます。これはコードです。

using (SqlConnection con = new SqlConnection(cs))
{
   SqlCommand cmd = new SqlCommand();
   cmd.Connection = con;
   con.Open();

   cmd.CommandText = "Delete from tbleProduct where ProductID= 4";
   int TotalRowsAffected = cmd.ExecuteNonQuery();
   Response.Write("Total rows affected :" + TotalRowsAffected );

   cmd.CommandText = "Insert into tbleProduct values (4, 'Calculator', 100, 230)";
   TotalRowsAffected = cmd.ExecuteNonQuery();
   Response.Write("Total rows affected :" + TotalRowsAffected );


   cmd.CommandText = "ypdate tbleProduct set QtyAvailbe = 234 where ProductID = 2";
   TotalRowsAffected = cmd.ExecuteNonQuery();
   Response.Write("Total rows affected :" + TotalRowsAffected );

 }
于 2013-11-14T20:02:00.143 に答える