2011-12-05 60 views
2

我正在創建一個考勤系統並使用網格視圖來插入數據。網格上可能有很多行。所有的事情都進展順利,數據也進入了良好的狀態。但我正在使用for循環來檢查每一行。當行數增加時,這會使性能變得非常慢。隨着行數的增加,往返程度也在增加。在不使用'for'循環的情況下在gridView中插入多行

任何人都可以提供更好的解決方案嗎?

我已經根據你的所有修改了我的代碼.....但是現在出現了一個問題,它只是多次插入網格的最後一行......除了這個代碼是好的。

MySqlDataAdapter myworkdatta = myworkdatta = new MySqlDataAdapter("SELECT CID,EID,TID,ATTENDENCE FROM EMPLOYEEATT ORDER BY AID DESC LIMIT 1", conn); 
            DataSet myworkdsatt = new DataSet(); 
            myworkdatta.Fill(myworkdsatt, "EMPLOYEEATT"); 

            int i; 
            for (i = 0; i < emplist_gv.Rows.Count; i++) 
            { 
             string tid = emplist_gv.Rows[i].Cells[6].Value.ToString(); 
             string eid = emplist_gv.Rows[i].Cells[0].Value.ToString(); 
             string atid = emplist_gv.Rows[i].Cells[7].Value.ToString(); 

             MySqlCommand cmdwk = new MySqlCommand("INSERT INTO EMPLOYEEATT (CID,EID,TID,ATTENDENCE) VALUES (@cid,@eid,@tid,@attendence)", conn); 
             MySqlParameter spcidatt = new MySqlParameter("@cid", calid); 
             MySqlParameter speid = new MySqlParameter("@eid", eid); 
             MySqlParameter sptid = new MySqlParameter("@tid", tid); 
             MySqlParameter spattendence = new MySqlParameter("@attendence", atid); 

             cmdwk.Parameters.Add(spcidatt); 
             cmdwk.Parameters.Add(speid); 
             cmdwk.Parameters.Add(sptid); 
             cmdwk.Parameters.Add(spattendence); 

             myworkdatta.InsertCommand = cmdwk; 

             DataRow drowk = myworkdsatt.Tables["EMPLOYEEATT"].NewRow(); 
             drowk["CID"] = calid; 
             drowk["EID"] = eid; 
             drowk["TID"] = tid; 
             drowk["ATTENDENCE"] = atid; 

             myworkdsatt.Tables["EMPLOYEEATT"].Rows.Add(drowk); 

            } 

            myworkdatta.Update(myworkdsatt, "EMPLOYEEATT"); 
+0

移動循環之前進行選擇,使循環後循環和更新表內表的變化。在循環的一次迭代中選擇2次並插入數據不是個好主意。 – Reniuz

+0

選擇語句是必需的,因爲它將獲取最後一行ID,並使用常規exp遞增1。 – Aaraadhana

+0

我有修改我的代碼根據你.....但現在出現了一個問題,它只是多次插入網格的最後一行......除了這個代碼是好的。 – Aaraadhana

回答

1

考慮你的選擇第2 SQL語句似乎並沒有包含相關的特定行任何你可以採取圈外的,只是使用它的價值很容易的。

因爲你需要在每一行上插入一個插入,所以我不明白爲什麼,那麼看起來很難刪除那裏的數據庫命中。

如果你正在做一個批量插入你可以看看的批量插入用於MySQL的:MySql Bulk insert

+0

先生不能將這行存儲在數據表溫度。並稍後更新到數據庫... – Aaraadhana

+0

Sir Select Select語句是必需的,因爲我將獲取最後一行ID並用常規exp增加1。 – Aaraadhana

+0

如果需要,您可以將其存儲在文件中並在後臺運行批處理過程。它不能存儲在內存或任何地方,所以仍然會有一些磁盤寫入正在進行。可能比數據庫寫入快得多。 –

0

您可以使用SqlBulkCopy,很容易使用。基本上只是提供一個數據表(或數據讀取器),它會將來自該源的行復制到目標表中。

不久,代碼塊看起來像:

DataTable dataTableInGridView = (DataTable)emplist_gv.DataSource; 
using (SqlConnection connection = 
      new SqlConnection(connectionString)) 
{ 
    using (SqlBulkCopy bulkCopy = 
        new SqlBulkCopy(connection)) 
    { 
     bulkCopy.DestinationTableName = 
      "dbo.BulkCopyDemoMatchingColumns"; 
     try 
     { 
      // Write from the source to the destination. 
      bulkCopy.WriteToServer(dataTableInGridView); 
     } 
     catch (Exception ex) 
     { 
      // Handle exception 
     } 
    } 
} 
+0

謝謝我會嘗試並用結果更新它... – Aaraadhana

+0

SqlBulkCopy在MySQl中不受支持 – Aaraadhana

相關問題