SqlBulkCopy NULL 값을 열에 삽입 할 수 없습니다.

.net c# fastmember sql sqlbulkcopy

문제

나는 Fastmember ( Fastmember NuGet ) 확장과 sqlbulkcopy를 사용하여 데이터베이스에 사용자 지정 개체의 특정 목록을 Bulkinsert하려고합니다. 그러나 그것은 나에게 다음과 같은 오류를 준다 :

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);
                }   
    }
}

모델 사용 먼저 Entity Framework에서 다음 테이블을 생성했습니다.

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을 만든 후에도 여전히 동일한 오류가 발생했습니다.

이 게시물 ( codeproject 솔루션 )에 걸쳐 왔고, 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'객체가 실제로 트랜잭션에서 사용되는지 궁금합니다. 'Item'참조와 관계없이 연결을 통해 ObjectReader.Create 단계를 수행 한 것처럼 보입니다.

iterator를 밟고 있기 때문에 트랜잭션 카운트를 줄여 올바른 행 수가 도착하는지 확인하십시오.

또한 예기치 않은 item.functionblockId 값을 진단 도구로 사용하여 트래핑 할 수도 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.