2013-04-21 87 views
1

我有一個DataGridView有303行和11列。當我要將所有這些數據保存到我的sql表時,需要30-40秒。這可能在1-2秒內保存這些數據。 我的代碼都是這樣要保存從DataGridView到C#2008中的Sql Server 2008的數據需要太多時間

public SqlConnection conn; 
SqlTransaction transaction; 
string strconn = "data source=nabid;Persist Security Info=false;database=dbTest;user id=sa ;password=123;Connection Timeout = 10000"; 
conn = new SqlConnection(strconn); 
conn.Open(); 
transaction = conn.BeginTransaction(); 
      try 
      { 
       if (DataGridView1.Rows.Count > 0) 
       { 
        clsProd.DeleteRecord("[tbl1]", ""); 
        foreach (DataGridViewRow r in DataGridView1.Rows) 
        { 
         if (r.Cells[0].Value != null) 
         { 
          Ticker = r.Cells[1].Value.ToString().Trim(); 

          string values = "'" + tt.Trim() + "',"; 
          values += "'" + r.Cells[1].Value.ToString().Trim() + "',"; // Ticker 
          values += (r.Cells[2].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[2].Value.ToString().Trim())) + ","; // LTP       
          values += Convert.ToDouble("0") + ","; // Open 
          values += (r.Cells[3].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[3].Value.ToString().Trim())) + ","; // High 
          values += (r.Cells[4].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[4].Value.ToString().Trim())) + ","; // LOW 
          values += (r.Cells[5].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[5].Value.ToString().Trim())) + ","; // Close 
          values += (r.Cells[6].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[6].Value.ToString().Trim())) + ","; // YCP 
          if (r.Cells[7].Value.ToString().Trim() == "--" || r.Cells[7].Value.ToString().Trim() == "") 
           chg_Prc = "0"; 
          else 
           chg_Prc = r.Cells[7].Value.ToString().Trim(); 
          values += Convert.ToDouble(chg_Prc.Trim()) + ","; // Change 
          values += (r.Cells[8].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[8].Value.ToString().Trim())) + ","; // Trade No 
          values += (r.Cells[9].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[9].Value.ToString().Trim())) + ","; // Volume 
          values += Convert.ToDouble("0") + ","; 
          if (r.Cells[2].Value.ToString().Trim() == "0.0" || r.Cells[2].Value.ToString().Trim() == "0.00" || r.Cells[2].Value.ToString().Trim() == "0") 
           tradeStatus = "N"; 
          else 
           tradeStatus = "Y"; 
          values += "'" + tradeStatus.Trim() + "',0"; 

          addRecord("[tbl1]", values); 
         } 
        } 
        closeConnection(); 

       this.Cursor = Cursors.Default; 
      } 
      catch (Exception exx) 
      { 
       this.Cursor = Cursors.Default; 
     errorTransaction(); 
       return; 
      } 

protected void ExecuteSQL(string sSQL) 
     { 
      SqlCommand cmd = new SqlCommand(sSQL, conn, transaction); 
      cmd.ExecuteNonQuery();    
     } 
public void DeleteRecord(string tblName, string values) 
     { 
      string sSQL = "DELETE FROM " + tblName + " " + values; 
      ExecuteSQL(sSQL); 
     } 
public void addRecord(string tblName, string values) 
     { 
      string sSQL = "INSERT INTO " + tblName + " VALUES(" + values + ")"; 
      ExecuteSQL(sSQL); 
     } 
public void closeConnection() 
     { 
      transaction.Commit(); 
      conn.Close(); 
     } 
public void errorTransaction() 
     { 
      transaction.Rollback(); 
      conn.Close(); 
     } 

回答

0

而不是調用函數的開銷計劃給予的,使SQL查詢單串多個插入,更新和刪除。

例如,

 string sqlInsert=""; 

     foreach (DataGridViewRow r in DataGridView1.Rows) 
     { 
     if (r.Cells[0].Value != null) 
           { 
            Ticker = r.Cells[1].Value.ToString().Trim(); 

            string values = "'" + tt.Trim() + "',"; 
            values += "'" + r.Cells[1].Value.ToString().Trim() + "',"; // Ticker 
            values += (r.Cells[2].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[2].Value.ToString().Trim())) + ","; // LTP       
            values += Convert.ToDouble("0") + ","; // Open 
            values += (r.Cells[3].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[3].Value.ToString().Trim())) + ","; // High 
            values += (r.Cells[4].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[4].Value.ToString().Trim())) + ","; // LOW 
            values += (r.Cells[5].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[5].Value.ToString().Trim())) + ","; // Close 
            values += (r.Cells[6].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[6].Value.ToString().Trim())) + ","; // YCP 
            if (r.Cells[7].Value.ToString().Trim() == "--" || r.Cells[7].Value.ToString().Trim() == "") 
             chg_Prc = "0"; 
            else 
             chg_Prc = r.Cells[7].Value.ToString().Trim(); 
            values += Convert.ToDouble(chg_Prc.Trim()) + ","; // Change 
            values += (r.Cells[8].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[8].Value.ToString().Trim())) + ","; // Trade No 
            values += (r.Cells[9].Value.ToString().Trim() == "" ? 0 : Convert.ToDouble(r.Cells[9].Value.ToString().Trim())) + ","; // Volume 
            values += Convert.ToDouble("0") + ","; 
            if (r.Cells[2].Value.ToString().Trim() == "0.0" || r.Cells[2].Value.ToString().Trim() == "0.00" || r.Cells[2].Value.ToString().Trim() == "0") 
             tradeStatus = "N"; 
            else 
             tradeStatus = "Y"; 
            values += "'" + tradeStatus.Trim() + "',0"; 

            sqlInsert=sqlInsert+"Insert into " + tblName + " VALUES(" + values + ")"; 
           } 
          } 
ExecuteSQL(sqlInsert); 

試着有這樣的代碼。

這會減少系統開銷。

希望它有幫助。

+0

謝謝你,讓我試試你的方式... – 2013-04-21 04:42:44

+0

謝謝。現在需要更少的時間。 – 2013-04-21 08:31:56

+0

@ M.Rain隨時歡迎 – Freelancer 2013-04-22 05:26:31

相關問題