2014-09-30 109 views
3

我想使用fastmember(Fastmember NuGet)擴展名和sqlbulkcopy將一定數量的自定義對象列表粘貼到我的數據庫中。但是它給了我下面的錯誤:SqlBulkCopy無法將值NULL插入列

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',它都被一個數字填充。更好的是,就像你在代碼中看到的那樣,我實際上在我將它硬編碼之前填充它進行硬編碼。

我不知道爲什麼會出現此錯誤,有沒有人有想法?

回答

6

在用測試數據手動生成DataTable後,它仍然給了我相同的錯誤。

我碰到過這篇文章(codeproject solution),並將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); 
            } } 
+0

你必須通過使用列映射跳過標識列。您的其他表格是否沒有標識列? – 2014-10-01 15:47:23

+0

它確實有一個標識列,後來我發現如果我這樣做:ObjectReader.Create(functionblock.connections,「Id」,「step」,「transition」,「steptotrans」,「functionblockId」))它也插入也沒有列映射。 – usselite 2014-10-01 16:22:12

0

然而,對於這個語法不太熟悉: 我不知道'item'對象是否實際在事務中被使用。 它看起來像ObjectReader.Create步驟通過連接,'item'引用的獨立 。

嘗試減少交易計數以確認正確的行數到達 ,因爲您可能正在加入迭代器。

此外,也許您可​​以嘗試捕獲item.functionblockId, 的意外值作爲診斷工具。

相關問題