2011-12-05 37 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

相关问题