2012-05-09 105 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)) 

BEGIN INSERT INTO Subject_has_ProjectsSubject_IdProjects_IdUsed)VALUES(param_SubjectId,param_ProjectId,param_Used); END

+0

您需要向我們展示了什麼'stp_InsertSubject'不正是要回答這個... – ChristopheD

+0

你'編號=(Int64的)cmd.ExecuteScalar();'每次循環都會覆蓋。 – jams

回答

2

幾件事情,以改善:

  • 打開環路(無需關閉 使用)
  • 創建命令,指定連接外部的連接只是一個時間僅在循環前一次
  • 在虛擬值循環之前創建所有參數
  • 只分配值內環路和調用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

您可以試試。打開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