2013-04-21 86 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

相关问题