SqlBulkCopy无法将值NULL插入列中
本文关键字:NULL 插入列 SqlBulkCopy | 更新日期: 2023-09-27 18:25:03
我正在尝试使用fastmember(fastmember NuGet)扩展名和sqlbulkcopy将某个自定义对象列表批量插入到我的数据库中。然而,它给了我以下错误:
An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Additional information: Cannot insert the value NULL into column 'functionblockId', table ''path...'DBFHX.MDF.dbo.connections'; column does not allow nulls. INSERT fails.
The statement has been terminated.
代码:
private void insertConnection(functionblock functionblock)
{
using (var bcp = new SqlBulkCopy(db.Database.Connection.ConnectionString))
{
foreach (connection item in functionblock.connections)
{
item.functionblockId = 1;
}
using (var creader = ObjectReader.Create(functionblock.connections, "step", "transition","steptotrans", "functionblockId"))
{
bcp.DestinationTableName = "connections";
bcp.WriteToServer(creader);
}
}
}
使用模型优先,实体框架生成了下表:
CREATE TABLE [dbo].[connections] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[step] NVARCHAR (MAX) NOT NULL,
[transition] NVARCHAR (MAX) NOT NULL,
[steptotrans] BIT NOT NULL,
[functionblockId] INT NOT NULL,
CONSTRAINT [PK_connections] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_functionblockconnection] FOREIGN KEY ([functionblockId]) REFERENCES [dbo].[functionblocks] ([Id])
);
该代码适用于另一个表,该表也包含相同的"functionblockId"和相同类型的其他字段(但不包含位字段)。
我手动检查了functionblock.connections列表中的所有值,然后在特定对象的"functionblockId"中,它都用一个数字填充。更好的是,正如你在代码中看到的那样,在我扩充它之前,我确实把它硬编码了
我不知道为什么会出现这个错误,有人知道吗?
在用测试数据手动创建DataTable后,它仍然给了我同样的错误。
我看到了这篇文章(代码项目解决方案),并将SqlBulkCopyColumnMapping应用于我的案例。
代码示例:
using (var bcp = new SqlBulkCopy(fhxm.Database.Connection.ConnectionString))
{
using (var creader = ObjectReader.Create(functionblock.connections, "step", "transition", "steptotrans", "functionblockId"))
{
SqlBulkCopyColumnMapping mapstep = new SqlBulkCopyColumnMapping("step", "step");
SqlBulkCopyColumnMapping maptran = new SqlBulkCopyColumnMapping("transition", "transition");
SqlBulkCopyColumnMapping mapstt = new SqlBulkCopyColumnMapping("steptotrans", "steptotrans");
SqlBulkCopyColumnMapping mapfunc = new SqlBulkCopyColumnMapping("functionblockId", "functionblockId");
bcp.ColumnMappings.Add(mapstep);
bcp.ColumnMappings.Add(maptran);
bcp.ColumnMappings.Add(mapstt);
bcp.ColumnMappings.Add(mapfunc);
bcp.DestinationTableName = "connections";
bcp.WriteToServer(creader);
} }
不过,对这个语法并不太熟悉:我想知道交易中是否真的使用了"item"对象。它看起来像ObjectReader。通过连接创建步骤,独立"item"引用的。
尝试减少事务计数以确认到达的行计数正确,因为您可能正在踩迭代器。
此外,也许您可以尝试捕获item.functionblockId的意外值,作为诊断工具。