2016-04-23 5 views
-3

"このコマンドに関連付けられている開いているDataReaderは既に閉じている必要があります。"という操作を実行すると、このメッセージが表示されます。開かれたデータリーダー

私のコードがあるします。public void UpdatePoints(文字列rightScore、文字列rightWinner) {

cmd.CommandText = "select * from Users_Details"; 
    cmd.Connection = connection; 
    connection.Open(); 
    rdr = cmd.ExecuteReader(); 

    while (rdr.Read()) 
    { 

     int points=0; 
     string sql; 
     string hisScore = (string)rdr["lastbetscore"]; 
     string hisWinner = (string)rdr["lastbetwinner"]; 
     if (rightScore == hisScore) 
      points = points + 30; 
     if (rightWinner == hisWinner) 
     { 
      points = points + 20; 
     } 

     sql = "update Users_Details set lastgame_points='" + points + "', gamesplayed='" + ((int)rdr["gamesplayed"] + 1) + "',currentpoints='" + ((int)rdr["currentpoints"] + points) + "',pointsPG='" + (((int)rdr["currentpoints"] + points)/((int)rdr["gamesplayed"] + 1)) + "' where username='" + (string)rdr["username"] + "'"; 
     cmd.CommandText = sql; 
     cmd.ExecuteScalar(); 
    } 
    rdr.Close(); 
    connection.Close(); 
} 

答えて

0

あなたは代わりにここに古いものを再利用の新しいコマンド・インスタンスを作成する必要があります。では

sql = "update Users_Details set lastgame_points='" + points + "', gamesplayed='" + ((int)rdr["gamesplayed"] + 1) + "',currentpoints='" + ((int)rdr["currentpoints"] + points) + "',pointsPG='" + (((int)rdr["currentpoints"] + points)/((int)rdr["gamesplayed"] + 1)) + "' where username='" + (string)rdr["username"] + "'"; 
cmd.CommandText = sql; 
cmd.ExecuteScalar(); 

をさらに、コマンドパラメータを読み込んで、SQL文字列を書式設定してSQLインジェクション攻撃を開きます。

3

エラーメッセージは、あなたが間違っていることをかなり具体的に示しています。別のコマンドのコマンドまたは接続を再利用することはできませんが、からデータを読み込んでいます。まず、すべてのデータをListまたは別のデータ構造体に読み込み、dbの各要素をこのListで更新する必要があります。

また、トランザクションが作成され、コミット一度しかなく、他の方法での取引は、各更新

に暗黙的に作成されますされますので、これはあなたの更新をスピードアップします

var transaction = connection.BeginTransaction(); 
... 
transaction.Commit(); 

取引であなたのステートメントを実行するために考えます

+0

私はそれを追加しましたが、エラーメッセージ –

+0

が表示されるようになりました。「このConnectionに関連付けられている開いているDataReaderが既にあります。 ? 「コマンド」の代わりに? –

+0

私の最初の答えは間違っていました。コマンドだけでなく接続も再利用できないからです。修正された答えを見てください。 –

関連する問題