c#中的大容量查询插入

本文关键字:查询 插入 大容量 | 更新日期: 2023-09-27 18:19:46

我正在使用从源表到目标表的批量查询插入记录。源表有10000条记录。假设源表有一列sid intsname varchar(60),目标列有sid intsname varchar(30)

现在,由于源sname和目标sname的长度问题,我无法成功插入所有记录。因为只有几行出现问题。

现在我的问题是,有没有任何方法可以使用大容量插入将记录插入到目标表中,从而插入正确的记录,而不插入不正确的记录。

我正在使用c#3.5

我正在使用的代码

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(constring, SqlBulkCopyOptions.UseInternalTransaction))
        {
            try
            {
                //Edit mapping.
                bulkCopy.ColumnMappings.Add("AddressID", "AddressID");
                bulkCopy.ColumnMappings.Add("AddressLine1", "AddressLine1");
                bulkCopy.ColumnMappings.Add("City", "City");
                //specify destination table.
                bulkCopy.DestinationTableName = "[Address]";
                bulkCopy.BatchSize = 100;
                bulkCopy.NotifyAfter = 100;
               // bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
                bulkCopy.WriteToServer(table);
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText("'n'n" + ex.Message);
            }
        }

谢谢。

c#中的大容量查询插入

您是通过SQL Server使用BULK INSERT,还是使用System.Data.SqlClient.SqlBulkCopy类?

如果您使用的是BULK INSERT T-SQL,那么您可以将MAXERRORS设置为等于您想要的阈值(默认值为10,这就是为什么您的`BULK INSERT可能会取消)。

BULK INSERT YourDb.YourSchema.YourTable
   FROM 'c:'YourFile.txt'
   WITH 
      (
         FIELDTERMINATOR =' |',
         ROWTERMINATOR =' |'n',
         MAXERRORS = 1000        -- or however many rows you think are exceeding the 30 char limit
      )

编辑

在看到您正在使用SqlBulkInsert类之后,我认为您最好在调用SqlBulkCopy.WriteToServer()方法之前修改DataTable

    foreach(DataRow row in table.Rows)
    {
        if (row["YourColumnThatExceeds30Chars"].ToString().Length > 30)
            row["YourColumnThatExceeds30Chars"] = 
                row["YourColumnThatExceeds30Chars"].ToString().Substring(0, 30);
    }