2012-05-09 10 views
0

ここに示す方法以外の方法で、複数のオブジェクトをMySQLデータベースに挿入する方法はありますか?これは動作しますが、実行に時間がかかります。複数のオブジェクトをMySQLに挿入

using (MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr)) 
     { 
      //Goes thrue the List<object> 
      foreach(List<object> sub in listSubject) 
      { 
      MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(); 
      cmd.Connection = conn; 
      cmd.CommandText = "CALL stp_InsertSubject(@param_SubjectId, @param_ProjectId, @param_Used);"; 
      cmd.Parameters.AddWithValue("@param_SubjectId",Convert.ToInt32(sub[0])); 
      cmd.Parameters.AddWithValue("@param_ProjectId", Convert.ToInt32(sub[1])); 
      cmd.Parameters.AddWithValue("@param_Used", Convert.ToBoolean(sub[2])); 

      conn.Open(); 

      cmd.ExecuteNonQuery(); 

      conn.Close(); 
       } 

マイストアドプロシージャ:

CREATE DEFINER=`mortenstarck`@`%` PROCEDURE `stp_InsertSubject`(param_SubjectId int(45), param_ProjectId int(45), param_Used tinyint(1)) 

Subject_has_ProjectsSubject_IdProjects_IdUsed)VALUES(param_SubjectId、param_ProjectId、param_Used)中 INSERTをBEGIN。 END

+0

あなたはstp_InsertSubject'がそれを答えるために、正確に何 '私たちを見る必要があるだろう... – ChristopheD

+0

をあなたの' ID =(Int64型ループ内で呼び出すと、 )cmd.ExecuteScalar(); '毎回ループオーバーライドする。 – jams

答えて

2

いくつかのこと:

  • オープンループの外側の接続だけで1時間(使用して を閉鎖する必要はありません)
  • は、コマンドを作成し、接続を割り当てますループの1回前に
  • ダミーの値を持つループの前にすべてパラメータを作成します
  • 割り当てのみ値は、ExecuteScalar()

using(MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr)) { conn.Open(); MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(); cmd.Connection = conn; cmd.CommandText = "CALL stp_InsertSubject(@param_SubjectId, @param_ProjectId, @param_Used);"; cmd.Parameters.AddWithValue("@param_SubjectId",0); cmd.Parameters.AddWithValue("@param_ProjectId", 0); cmd.Parameters.AddWithValue("@param_Used", false); foreach(List<object> sub in listSubject) { cmd.Parameters["@param_SubjectId"].Value = Convert.ToInt32(sub[0]) ; cmd.Parameters["@param_ProjectId"].Value = Convert.ToInt32(sub[1]); cmd.Parameters["@param_Used"].Value = Convert.ToBoolean(sub[2]); Id = (Int64)cmd.ExecuteScalar(); } }
+0

なぜダミー値を使用しますか?明示的な型でパラメータを作成するだけではどうですか? –

+0

@ConradFrix私は例を挙げようとしていますが、コードを正しい形式にすることはできません – Steve

0

これらのコールを1回のトランザクションで囲むことを考えましたか?

1

お試しください。 foreachループ外に接続してください。これにより、毎回ループを開いたり閉じたりする時間が節約されます。これにより、パフォーマンスが向上します。改善する

Int64 Id = 0; 
using (MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr)) 
{ 
    //Goes through the List<object> 
    conn.Open(); 
    foreach(List<object> sub in listSubject) 
    { 
     MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandText = "CALL stp_InsertSubject(@param_SubjectId, @param_ProjectId, @param_Used);"; 
     cmd.Parameters.AddWithValue("@param_SubjectId",Convert.ToInt32(sub[0])); 
     cmd.Parameters.AddWithValue("@param_ProjectId", Convert.ToInt32(sub[1])); 
     cmd.Parameters.AddWithValue("@param_Used", Convert.ToBoolean(sub[2])); 
     Id = (Int64)cmd.ExecuteScalar(); 
    } 
    conn.Close(); 
} 

How bad is opening and closing a SQL connection for several times? What is the exact effect?

+1

私の遅い指を呪う!これはおそらく、挿入方法を変更せずに問題を解決する最良の方法です。 – FlyingStreudel