c# - 批量复制提交行没有错误

标签 c# sql sql-server

我有一个处理列表并使用 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/

相关文章:

远程连接到 SQL Server 2005 实例时出现 C# 异常

c# - EF Core 2.0 FromSql 加载相关实体

sql - MAX() OVER PARTITION BY 没有按预期工作

sql - sql server单行多列成一列

c# - 如何实例化 DataReceivedEventArgs 或者能够用数据填充它?

c# - 表达式查询中的动态 Lambda 表达式

sql - Access SQL查询: How to only display most recent record of duplicates

mysql - 根据ID选择用户投票栏

sql - 计算 SHOW TABLE EXTENDED 返回的结果集中的行

c# - 如何在MVVM中更改SelectedIndex