2016-04-12 1 views
1

私のデータベースにコミットしようとしていますが、クエリを実行しようとすると開いていないという例外が表示されています。誰も私がここで間違っていることを説明することはできますか? GetConnectionString(DbMap)は、このコードを実行する前にテーブルを作成するために使用しているので、間違いなく正しい文字列を返します。接続が開いていません:MySql BeginTransaction

public static void InsertDataTable(DataTable dt) 
{ 
    try 
    { 
     //Open the SQL Connection 
     using (var dbConnection = new MySqlConnection(GetConnectionString(DbMap))) 
      { 
       dbConnection.Open(); 
       //Instantiate the Command 
       using (var cmd = new MySqlCommand()) 
       { 
        //Create a new Transaction 
        using (var transaction = dbConnection.BeginTransaction()) 
        { 
         for (int i = 0; i < dt.Rows.Count; i++) 
         { 
          //var identifier = dt.Rows[i].Field<int>("Identifier"); 
          var entry = dt.Rows[i].Field<uint>("Entry"); 
          var name = dt.Rows[i].Field<string>("Name"); 
          var zone = dt.Rows[i].Field<uint>("Zone"); 
          var type = dt.Rows[i].Field<ObjectType>("Type"); 

          //Add data value with Parameters. 
          cmd.Parameters.AddWithValue("@Entry", entry); 
          cmd.Parameters.AddWithValue("@Name", name); 
          cmd.Parameters.AddWithValue("@Type", type); 

          //Create command to execute the insertion of Data into desired Table 
          string dataTableName = "zone_" + zone; 
          cmd.CommandText = $"INSERT INTO [{dataTableName}] " + 
               "([entry], [name], [type]) " + 
               "VALUES (@Entry, @Name, @Type)"; 

          cmd.ExecuteNonQuery(); 
         } //for (int i = 0; i < dt.Rows.Count; i++) 

         //Commit the Transaction 
         transaction.Commit(); 
        } //using (var transaction = dbConnection.BeginTransaction()) 
       } //using (var cmd = new MySqlCommand()) 

       //Close the Connection 
       dbConnection.Close(); 
      } 
    } 
    catch (MySqlException ex) 
    { 
     Logger.Write("InsertDataTable | MySqlException: " + ex); 
    } 
    catch (Exception ex) 
    { 
     Logger.Write("InsertDataTable | Exception: " + ex); 
    } 
} 
+0

あなたは、各行のための新しいコマンドを作成する必要があります。 'using(var cmd ='はループの中にあるべきです。また、C#でMySqlを頻繁に使用しませんが、コマンドと接続の間にリンクがありません。新しいMySqlCommand(dbConnection) '? – Rob

+0

新しいMySqlCommand(dbConnection)は、私たちがforループに入るまで形成されないコマンドテキストを必要とするため、機能しません。 –

答えて

3

理由は、接続を割り当てていない(またはコマンドの接続プロパティを初期化していない)ためです。少数のより多くの事

//Code here 
cmd.Connection=dbConnection; 
cmd.CommandType = CommandType.Text; 
cmd.Connection = dbConnection; 
//code here; 

:ロブで述べたように

  • あなたが接続usingを閉じるために.Close()をコールする必要はありませんが、あなた
  • のためにそれを行いますので、何をする必要があるということです各反復ごとに新しいコマンドを使用するほうがよいとコメントしています。
  • 続きを読むParameters.Add instead for AddWithValue;

を参照してください例:

using (var transaction = dbConnection.BeginTransaction()) 
{ 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     var entry = dt.Rows[i].Field<uint>("Entry"); 
     var name = dt.Rows[i].Field<string>("Name"); 
     var zone = dt.Rows[i].Field<uint>("Zone"); 
     var type = dt.Rows[i].Field<object>("Type"); 
     using (var cmd = new MySqlCommand()) 
     { 
      cmd.Parameters.Add("@Entry", MySqlDbType.UInt32).Value = entry; 
      cmd.Parameters.Add("@Name", MySqlDbType.VarString); 
      cmd.Parameters.Add("@Type", MySqlDbType.Blob).Value=type; //choose the type correctly 
      string dataTableName = "zone_" + zone; 
      cmd.CommandText = @"INSERT INTO [{dataTableName}] " + 
           "([entry], [name], [type]) " + 
           "VALUES (@Entry, @Name, @Type)"; 
      cmd.CommandType = CommandType.Text; 
      cmd.Connection = dbConnection; 
      cmd.ExecuteNonQuery(); 
     } 
    }      
    transaction.Commit(); 
} 
+0

それができました! –

+0

AddWithValueの代わりにAddを使用すると、VS2015から推奨されていない警告が表示されるため、AddWithValueを使用するように指示しています。http://stackoverflow.com/questions/13580993/mysqlcommand-command-parameters-add-is-obsoleteを参照してください。 –

関連する問題