我有一个处理列表并使用 SQL 批量复制将其插入数据库的过程,因为这个列表可能特别大。它工作正常,检查约束,一切都很完美。问题是,如果我有 10,000 条记录并且其中一条记录有错误,我仍然想提交其他 9,999 条记录。除了在 SQL 批量复制之前手动检查每个约束或一次插入一个约束之外,还有其他方法可以做到这一点吗?看起来既乏味又缓慢,哪一种打败了重点。谢谢。
var copy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["constr"].ConnectionString, SqlBulkCopyOptions.CheckConstraints)
{
DestinationTableName = obj.TableName
};
var table = new DataTable();
copy.WriteToServer(table);
最佳答案
没有设置batch size到 1(这会破坏批量复制的目的)或在复制之前预先检查数据解决此问题的正常方法是复制到与目标表具有相同架构但没有约束的临时表,删除违反插入约束的行,然后从临时表正常插入到您的实时表中。
const string _createTableString = "Create table #temp (/* SNIP */)";
const string _insertTableString = @"
declare @sql nvarchar(2000)
set @sql = N'INSERT INTO ' + QUOTENAME(@tableName) + N' SELECT * from #temp'
exec sp_executesql @sql";
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString))
{
connection.Open();
using (var command = new SqlCommand(_createTableString, connection))
{
command.ExecuteNonQuery();
}
using (var copy = new SqlBulkCopy(connection))
{
copy.DestinationTableName = "#temp";
copy.WriteToServer(table);
}
using (var command = new SqlCommand(_insertTableString, connection))
{
command.Parameters.AddWithValue("@tableName", obj.TableName)
command.ExecuteNonQuery();
}
}
请注意 QUOTENAME
的使用,以确保没有 SQL 注入(inject)可以通过传递给 obj.TableName
的表名潜入。
关于c# - 批量复制提交行没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058886/