我正在使用从源表到目标表的批量查询插入记录。源表有 10,000 条记录。假设源表有一个列 sid int
, sname varchar(60)
和目标列有 sid int
, sname 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);
}
}
谢谢。
最佳答案
你在使用 BULK INSERT
通过 SQL Server,或者您正在使用 System.Data.SqlClient.SqlBulkCopy
类(class)?
如果您使用 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
后类,我认为你最好的选择是修改 DataTable
在调用 SqlBulkCopy.WriteToServer()
之前方法:
foreach(DataRow row in table.Rows)
{
if (row["YourColumnThatExceeds30Chars"].ToString().Length > 30)
row["YourColumnThatExceeds30Chars"] =
row["YourColumnThatExceeds30Chars"].ToString().Substring(0, 30);
}
关于c# - c#中的批量查询插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8770825/