在具有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]
Run Code Online (Sandbox Code Playgroud)
与C#代码
tran = connection.BeginTransaction();
SqlBulkCopy sqlCopy = new SqlBulkCopy(connection,SqlBulkCopyOptions.Default, tran);
sqlCopy.DestinationTableName = "MyTable";
sqlCopy.WriteToServer(dataTable);
Run Code Online (Sandbox Code Playgroud)
给你一个错误......
列'MyPrimaryKey'不允许DBNull.Value
我试过摆弄SqlBulkCopyOptions.唯一有效的方法是将MyPrimaryKey字段设置为允许空值并删除主键.
任何人都知道这个问题是否有解决方法?或者您可以验证没有解决方法(除了更改表结构)?
小智 11
您需要设置列映射.第一次打电话
sqlCopy.ColumnMappings.Clear();
Run Code Online (Sandbox Code Playgroud)
然后打电话
sqlBulkCopy.ColumnMappings.Add("Status", "Status");
sqlBulkCopy.ColumnMappings.Add("Priority", "Priority");
Run Code Online (Sandbox Code Playgroud)
这意味着批量复制将停止尝试插入MyPrimaryKey列,并且只会插入status和Priority列.
您唯一的选择是从正在加载的数据中删除 MyPrimaryKey 字段或修改表结构。
由于该字段没有任何值,您是在告诉 SQL 您希望将 null 强制写入该字段,这显然是不允许的。