SqlBulkCopy WriteToServer Beispiel. Was mache ich falsch?

c# sql sqlbulkcopy sql-server

Frage

Das könnte lange dauern, aber ich möchte mein Beispiel erklären

Ich habe diesen Code:

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

Als ich es ausführte, bekam ich Daten, die in der FK-Spalte der Kindtabelle korrekt aussehen. (0 und 1) Die Sache ist, dass nach dem Speichern die Daten in die Datenbank gelangen, aber es ist nicht in Ordnung. Anstatt die FK-ID aus der übergeordneten Tabelle zu haben, habe ich die 0 und die 1 aus dem C # -Code erhalten. Hinweis: Die Tabellen im DB DO HABE FK Constrain auf ihnen. Du kannst das Zeug nicht manuell hinzufügen, aber SqlBulkCopy WriteToServer hat kein Problem, schreibt trotzdem falsche Daten (es ist so, als ob es nicht auf Einschränkungen überprüft wird)

Schau dir die Tabellen an:

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]

Die Ergebnisse sehen so aus:

select * from aTestSw

Id          Title
16          a
17          b

select * from aTestSwChild

Id          ParentId    Description
12          0           c
13          1           d

Was mache ich falsch? Wahrscheinlich sollte ich Ids nicht so in C # bekommen. Aber wie? Oder ist es überhaupt möglich? Ich meine, wie wird mein zweiter Bulkinsert den SQL kennen lernen !!!! ID beim Einfügen?

Akzeptierte Antwort

Verwendung dieser Option:

SqlBulkCopyOptions.KeepIdentity

Setzen Sie CheckConstraints Ihrer Datenbank vor der Massenkopieraktion auf OFF. Danach fügen Sie Ihre Daten mit Bulk-Kopie ein. Wenn alle Ihre Arbeiten erledigt sind, setzen Sie CheckConstraints auf ON.

Die Option ups zwingt Ihre Datenbank, Ihre Identitätswerte beizubehalten.


Beliebte Antwort

Standardmäßig wird SqlBulkCopy Ihre Fremdschlüssel in nocheck Fremdschlüssel verwandeln. Sie müssen die Option SqlBulkCopyOptions.CheckConstraints hinzufügen, damit Ihre Fremdschlüssel alle vorhandenen und alle neuen Daten prüfen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow