2017-11-11 8 views
-1

データベースを読み込み中にデータベースを更新しようとしていますが、読み込みが終了して読めないという例外がスローされます。 update.ExecuteNonQuery()はリーダーメソッドを閉じていますか?例外:リーダーが閉じているときに読み込みが無効になる

私はラインcon.Close();con.Open();を取り除く場合、私は読書開けを維持しながら、それでは、どのように私は自分のデータベースレコードを更新することができThere is already an open DataReader associated with this Connection which must be closed first.

を取得しますか?

{ 
    public class MySqlReadUpdate 
    { 
     public int Id { get; set; } 
     public string Notes { get; set; } 
    } 

    static void Main() 
    { 
     List<MySqlReadUpdate> dbData = new List<MySqlReadUpdate>(); 

     var config = "server=localhost;user id=root; database=restaurants; pooling=false;SslMode=none;Pooling=True"; 
     MySqlConnection con = new MySqlConnection(config); 

     MySqlDataReader reader = null; 
     string query = "SELECT id, notes FROM customers"; 

     MySqlCommand command = new MySqlCommand(query, con); 
     con.Open(); 
     reader = command.ExecuteReader(); 

     while (reader.Read()) 
     { 
      MySqlReadUpdate newMySqlReadUpdate = new MySqlReadUpdate(); 

      newMySqlReadUpdate.Id = (int)reader["id"]; 
      newMySqlReadUpdate.Notes = (string)reader["notes"]; 
      string note = newMySqlReadUpdate.Notes; 
      var notesplit = note.Split(' ', '\n')[1]; 
      dbData.Add(newMySqlReadUpdate); 
      Console.WriteLine(newMySqlReadUpdate.Id); 
      Console.WriteLine(newMySqlReadUpdate.Notes); 
      Console.WriteLine(note); 
      Console.WriteLine(notesplit); 
      con.Close(); 
      con.Open(); 

      string query2 = "UPDATE customers SET notes='" + notesplit + "' WHERE id='" + newMySqlReadUpdate.Id + "';"; 
      MySqlCommand update = new MySqlCommand(query2, con); 
      update.ExecuteNonQuery(); 
     } 
     con.Close(); 

     Console.WriteLine("Finished!"); 
     Console.Read(); 

    } 
    } 
} 
+0

'update.ExecuteNonQuery();'で例外が発生しますか? – SpiderCode

+0

'while(reader.Read()) 'で例外が発生しました –

答えて

1

データリーダーが依存しているため、接続を閉じることはできません。 con.Closeに電話をかけたら、それを壊します。だから、次回にはreader.Read()になると例外が発生するのです。

設定文字列にMultipleActiveResultSets=Trueを追加します。しかし、コメントで議論したように、MySQLではまだサポートされていません。したがって、答えは2つの接続インスタンスです。

List<MySqlReadUpdate> dbData = new List<MySqlReadUpdate>(); 

var config = "server=localhost;user id=root;database=restaurants;pooling=false;SslMode=none"; 
MySqlConnection con = new MySqlConnection(config); 
MySqlConnection cmdCon = new MySqlConnection(config); 

MySqlDataReader reader = null; 
string query = "SELECT id, notes FROM customers"; 

MySqlCommand command = new MySqlCommand(query, con); 
con.Open(); 
cmdCon.Open(); 
reader = command.ExecuteReader(); 

while (reader.Read()) 
{ 
    MySqlReadUpdate newMySqlReadUpdate = new MySqlReadUpdate(); 

    newMySqlReadUpdate.Id = (int)reader["id"]; 
    newMySqlReadUpdate.Notes = (string)reader["notes"]; 
    string note = newMySqlReadUpdate.Notes; 
    var notesplit = note.Split(' ', '\n')[1]; 
    dbData.Add(newMySqlReadUpdate); 
    Console.WriteLine(newMySqlReadUpdate.Id); 
    Console.WriteLine(newMySqlReadUpdate.Notes); 
    Console.WriteLine(note); 
    Console.WriteLine(notesplit); 

    string query2 = "UPDATE customers SET notes='" + notesplit + "' WHERE id='" + newMySqlReadUpdate.Id + "';"; 
    MySqlCommand update = new MySqlCommand(query2, cmdCon); 
    update.ExecuteNonQuery(); 
} 
con.Close(); 
cmdCon.Close(); 

Console.WriteLine("Finished!"); 
Console.Read(); 

私はあなたにもusingステートメントを使用するかのtry-finallyブロックで物事をラップするようにコードを修正することをお勧めします。

+0

私は試しましたが、MySQLはMultipleActiveResultSetsをパラメータとしてサポートしていません。それはSQLのためにのみ –

+0

私は彼らが以前にそれを追加したと思った。驚くべきことに、これらすべての年の後にサポートは追加されていません。したがって、それが真であると仮定すると、2つの接続インスタンスが必要です。 (あなたの現在の接続文字列は2回設定されています) –

+0

はい、読者が閉じてデータベーステーブルの読み込みを停止し、閉じた理由を理解できません –

関連する問題