SqlBulkCopy WriteToServer 예제입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

c# sql sqlbulkcopy sql-server

문제

이것은 길지만, 예제를 설명하고자합니다.

나는이 코드를 가지고 :

#region [parent table]
DataTable dtParent = new DataTable();
DataColumn dc;

dc = new DataColumn();
dc.DataType = System.Type.GetType("System.Int32");
dc.ColumnName = "Id";
dc.Unique = true;
dc.AutoIncrement = true;
dtParent.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType("System.String");
dc.ColumnName = "Title";
dc.Unique = false;
dtParent.Columns.Add(dc);

dtParent.TableName = "aTestSw";
dtParent.PrimaryKey = new DataColumn[] { dtParent.Columns[0] };
#endregion

#region [child table]
DataTable dtChild = new DataTable();

dc = new DataColumn();
dc.DataType = System.Type.GetType("System.Int32");
dc.ColumnName = "Id";
dc.Unique = true;
dc.AutoIncrement = true;
dtChild.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType("System.Int32");
dc.ColumnName = "ParentId";
dc.Unique = false;
dtChild.Columns.Add(dc);

dc = new DataColumn();
dc.DataType = System.Type.GetType("System.String");
dc.ColumnName = "Description";
dc.Unique = false;
dtChild.Columns.Add(dc);

dtChild.TableName = "aTestSwChild";
dtChild.PrimaryKey = new DataColumn[] { dtChild.Columns[0] };
#endregion

DataSet DataSet1 = new DataSet();
DataSet1.Tables.Add(dtParent);
DataSet1.Tables.Add(dtChild);

#region [fk]
DataColumn parentColumn = dtParent.Columns["Id"];
DataColumn childColumn = dtChild.Columns["ParentId"];
DataRelation relParentChild = new DataRelation("ParentChild", 
    parentColumn, childColumn);
DataSet1.Relations.Add(relParentChild); 
#endregion

#region [fill parent]
DataRow dr2saveIn = dtParent.NewRow();
dr2saveIn["Title"] = "a";
dtParent.Rows.Add(dr2saveIn);

dr2saveIn = dtParent.NewRow();
dr2saveIn["Title"] = "b";
dtParent.Rows.Add(dr2saveIn);
#endregion

#region [fill child]
dr2saveIn = dtChild.NewRow();
dr2saveIn["Description"] = "c";
dr2saveIn["ParentId"] = dtParent.Rows[0]["Id"];
dtChild.Rows.Add(dr2saveIn);

dr2saveIn = dtChild.NewRow();
dr2saveIn["Description"] = "d";
dr2saveIn["ParentId"] = dtParent.Rows[1]["Id"];
dtChild.Rows.Add(dr2saveIn);   
#endregion

SqlBulkCopy bulkCopy = new SqlBulkCopy(
    "server=aaa;database=bbb;uid=ccc;password=ddd", 
    SqlBulkCopyOptions.TableLock);
bulkCopy.DestinationTableName = "dbo.aTestSw";
bulkCopy.WriteToServer(dtParent);
bulkCopy.DestinationTableName = "dbo.aTestSwChild";
bulkCopy.WriteToServer(dtChild);

그것을 실행할 때 자식 테이블의 FK 열에서 "보이는"데이터를 얻었습니다. (0과 1) 문제는 저장 후 데이터가 데이터베이스에 저장되지만 문제가되지 않는다는 것입니다. 부모 테이블에서 FK id를 갖는 대신 C # 코드에서 0과 1을 얻었습니다. 참고 : DB DO HAVE FK의 테이블에는 제한이 있습니다. 수동으로 그 물건을 추가 할 수는 없지만 SqlBulkCopy WriteToServer는 아무런 문제가 없으며, 어쨌든 잘못된 데이터를 씁니다 (제약 조건을 확인하지 않은 것과 같습니다)

테이블을보십시오 :

CREATE TABLE [dbo].[aTestSw](
 [Id] [int] IDENTITY(1,1) NOT NULL,
 [Title] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [PK_aTestSw] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[aTestSwChild](
 [Id] [int] IDENTITY(1,1) NOT NULL,
 [ParentId] [int] NOT NULL,
 [Description] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 CONSTRAINT [PK_aTestSwChild] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[aTestSwChild]  WITH NOCHECK ADD  CONSTRAINT [FK_aTestSwChild_aTestSw] FOREIGN KEY([ParentId])
REFERENCES [dbo].[aTestSw] ([Id])

ALTER TABLE [dbo].[aTestSwChild] CHECK CONSTRAINT [FK_aTestSwChild_aTestSw]

결과는 다음과 같습니다.

select * from aTestSw

Id          Title
16          a
17          b

select * from aTestSwChild

Id          ParentId    Description
12          0           c
13          1           d

내가 도대체 ​​뭘 잘못하고있는 겁니까? 아마도 나는이 ID를 C #에서 얻지 않기로되어 있습니다. 그러나 어떻게? 또는 심지어 가능합니까? 제 두 번째 대량 삽입이 SQL을 어떻게 알게 될까요? !!!! 이드는 삽입 했습니까?

수락 된 답변

이 옵션의 사용 :

SqlBulkCopyOptions.KeepIdentity

대량 복사 작업 전에 db의 CheckConstraints를 OFF로 설정하십시오. 이 후에 대량 복사를 사용하여 데이터를 삽입하십시오. 모든 작업이 완료되면 CheckConstraints를 ON으로 설정하십시오.

위쪽 옵션은 귀하의 신원 가치를 유지하기 위해 DB를 강제로.


인기 답변

기본적으로 SqlBulkCopy는 외래 키를 nocheck 외래 키로 변환합니다. 외래 키가 기존의 데이터와 모든 새로운 데이터를 모두 확인하도록하려면 SqlBulkCopyOptions.CheckConstraints 옵션을 추가해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow