【问题标题】:Insert several rows in a gridView without using a 'for' loop在不使用“for”循环的情况下在 gridView 中插入几行
【发布时间】:2011-12-05 06:19:19
【问题描述】:

我正在创建一个考勤系统并使用网格视图插入数据。网格上可能有很多行。一切进展顺利,数据也顺利进入。但我使用for 循环来检查每一行。当行数增加时,这会使性能变得很慢。而且往返次数也随着行数的增加而增加。

谁能为此提供更好的解决方案?

我已经根据你们修改了我的代码.....但是现在出现了一个问题,它只是多次插入网格的最后一行......除此之外,代码很好。

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");

【问题讨论】:

  • 在循环前移动选择,在循环内更改表并在循环后更新表。在循环的一次迭代中选择 2 次并插入数据不是一个好主意。
  • 需要选择语句,因为它将获取最后一行 ID 并使用常规 exp 递增 1。
  • 我已经根据你修改了我的代码.....但是现在出现了一个问题,它只是多次插入网格的最后一行......除此之外的代码很好。
  • 您需要在循环之前获取 id 并在每次迭代中递增它。类似drowk["ATTENDENCE"] = atid + i;
  • ID 是自动递增的,因此它发生在数据库本身...

标签: c# mysql gridview datagridview


【解决方案1】:

考虑到您的 2 select SQL 语句似乎不包含与特定行相关的任何内容,您可以将其从循环中取出并轻松使用其值。

因为您需要在每一行上进行插入,我不明白为什么,所以似乎很难删除那里的数据库命中。

如果您正在执行批量插入,您可以查看 MySql 的批量插入:MySql Bulk insert

【讨论】:

  • 先生,这行不能存储在数据表临时文件中。后来更新到数据库...
  • 先生,需要 Select 语句,因为我将获取最后一行 ID 并使用常规 exp 递增 1。
  • 如果需要,您可以将其存储在文件中并在后台运行批处理。它不能存储在内存或任何地方,所以仍然会有一些磁盘写入。可能比数据库写入快很多。
  • 通过获取最后一行,您可以在同一插入语句中使用 mysql_insert_id() 并通过插入获取 ID。至于将 ID 加 1,如果您手动执行此操作,则应在数据库中通过将主键设置为标识列来完成
  • 我已经根据你修改了我的代码.....但是现在出现了一个问题,它只是多次插入网格的最后一行......除此之外的代码很好。
【解决方案2】:

您可以使用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
        }
    }
}

【讨论】:

  • MySQl 不支持 SqlBulkCopy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2021-01-03
  • 2019-11-29
  • 2017-03-30
相关资源
最近更新 更多