如何在具有GUID主键和默认newsequentialid()的表上使用SQLBulkCopy?

时间:2020-03-06 14:46:18  来源:igfitidea点击:

在具有GUID主键和默认newsequentialid()的表上使用SQLBulkCopy时

例如

CREATE TABLE [dbo].[MyTable](
[MyPrimaryKey] [uniqueidentifier] NOT NULL CONSTRAINT [MyConstraint]  DEFAULT (newsequentialid()),
[Status] [int] NULL,
[Priority] [int] NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED 
(
[MyPrimaryKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Ccode

tran = connection.BeginTransaction();
        SqlBulkCopy sqlCopy = new SqlBulkCopy(connection,SqlBulkCopyOptions.Default, tran);            

        sqlCopy.DestinationTableName = "MyTable";            
        sqlCopy.WriteToServer(dataTable);

给你一个错误...

列" MyPrimaryKey"不允许使用DBNull.Value

我尝试摆弄SqlBulkCopyOptions。唯一有效的方法是将MyPrimaryKey字段设置为允许空值并删除主键。

有人知道是否有解决此问题的方法吗?
还是可以验证没有解决方法(除了更改表结构以外)?

解决方案

我们唯一的选择是从正在加载的数据中删除MyPrimaryKey字段或者修改表结构。

在字段没有值的情况下,我们要告诉SQL我们想将null强制插入字段,这显然是不允许的。

我们需要设置列映射。首次通话

sqlCopy.ColumnMappings.Clear();

然后打电话

sqlBulkCopy.ColumnMappings.Add("Status", "Status");
sqlBulkCopy.ColumnMappings.Add("Priority", "Priority");

这意味着批量复制将停止尝试插入MyPrimaryKey列,而只会插入status和Priority列。