带有标识列的SqlBulkCopy插入
我正在使用SqlBulkCopy
对象将几百万生成的行插入到数据库中。 唯一的问题是我插入的表有一个标识列。 我已经尝试将SqlBulkCopyOptions
设置为SqlBulkCopyOptions
,并将标识列设置为0
, DbNull.Value
和null
。 这些都没有工作。 我觉得我错过了一些非常简单的事情,如果有人能够启发我,这将是太棒了。 谢谢!
编辑为了澄清,我没有在我导入的DataTable
设置的身份值。 我希望将它们作为导入的一部分生成。
编辑2这里是我用来创build基SqlBulkCopy
对象的代码。
SqlBulkCopy sbc = GetBulkCopy(SqlBulkCopyOptions.KeepIdentity); sbc.DestinationTableName = LOOKUP_TABLE; private static SqlBulkCopy GetBulkCopy(SqlBulkCopyOptions options = SqlBulkCopyOptions.Default) { Configuration cfg = WebConfigurationManager.OpenWebConfiguration("/RSWifi"); string connString = cfg.ConnectionStrings.ConnectionStrings["WifiData"].ConnectionString; return new SqlBulkCopy(connString, options); }
要让目标表分配标识,请不要使用SqlBulkCopyOptions.KeepIdentity
选项。 相反,不要从源头映射身份,也不要将其从源文件中提取出来发送到SqlBulkCopy
。
填充BulkCopy对象的ColumnMapping(请参阅此 ),不要映射标识列。 标识列将由目标数据库生成。
你有两个select –
1 – 使用KeepIdentity
并保留源的Identity
值。
2 – 不要映射Identity
字段。 如果您不尝试分配值,目标表将自动分配一个值。
是的,你是正确的使用SqlBulkCopyOptions.KeepIdentity选项,然后bulkcopy编写器不认为你是什么表结构这个对象写入从开始专栏,所以对于我们的需要,我做同样的方式来维护我的表中的身份字段只是你必须在你的数据表对象中添加一个额外的列,并将空值传递给这个列,然后表自动处理标识。
原因 : – 数据末尾的Excel中有一些空行,可能看起来像空行。 批量上传试图将这些空行上传到表中。
解决scheme : – 只select包含数据的行 – 将数据复制到新工作表中。 假设您在“工作表1”中有数据,将其移至“工作表2”并删除“工作表1”。
在我的情况下,它竟然是列名内的空格,并在我的SQL表中意外使用hyphon( – )而不是下划线(_)的列之一。 我用SQL表中的下划线replace空格和hyphon,并解决了问题。