如何在 SQL Bulk Copy 操作中指定两个数据表之间的外键?
How to specify foreign keys between two DataTables in SQL Bulk Copy operation?
我有两个数据表A和B。A是parenttable。 B 中的行包含引用 A 的字段 ParentId。
我想分别批量插入A和B。插入A后,如何设置B中对应child行的ParentId?
更新:
我有以下创建数据表的代码:
var a= new DataTable("A");
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn fee = new DataColumn("Fee", typeof(decimal));
billable.Columns.Add(fee);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
对于 child table:
var b= new DataTable("B");
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn parentId= new DataColumn("ParentId", typeof(int));
billable.Columns.Add(parentId);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
我还没有在两个 table 之间建立任何关系。我想知道如何以正确的方式做到这一点。
以下是我用于批量插入的代码:
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
try
{
bulkCopy.DestinationTableName = "dbo.A";
bulkCopy.WriteToServer(a);
bulkCopy.DestinationTableName = "dbo.B";
bulkCopy.WriteToServer(b);
}
catch (Exception ex)
{
Logger.Error(ex, "Bulk copy operation failed.");
}
}
SqlBulkCopy
没有 return 身份值。因此,除非您的 table A
有另一个独特的列,例如 "Code" 以允许完善 SELECT
,否则您将无法检索生成的标识值。
免责声明:我是项目的所有者Bulk Operations
这个库不是免费的,但允许输出标识值。它在引擎盖下使用 SqlBulkCopy
和 Temporary Table
以允许此功能
using (var bulkCopy = new BulkOperation(connection))
{
bulkCopy.Transaction = transaction;
bulkCopy.DestinationTableName = "dbo.A";
bulkCopy.ColumnMappings.Add("Id", ColumnMappingDirectionType.Output);
bulkCopy.ColumnMappings.Add("Col1");
bulkCopy.ColumnMappings.Add("Col2");
bulkCopy.BulkInsert(a);
// Copy identity value in `Id` from table A to `ParentId` in table B
// ...code...
}
我不会使用身份 link 这两个表,而是使用 GUID link 它们。像这样:
var a= new DataTable("A");
DataColumn guid= new DataColumn("Guid", typeof(Guid));
billable.Columns.Add(Guid.NewGuid());
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn fee = new DataColumn("Fee", typeof(decimal));
billable.Columns.Add(fee);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
然后是children
var b= new DataTable("B");
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn parentId= new DataColumn("ParentGuid", typeof(Guid));
billable.Columns.Add(parentGuid);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
这意味着您知道 link 在插入之前、在生成标识之前会是什么。
我有两个数据表A和B。A是parenttable。 B 中的行包含引用 A 的字段 ParentId。
我想分别批量插入A和B。插入A后,如何设置B中对应child行的ParentId?
更新:
我有以下创建数据表的代码:
var a= new DataTable("A");
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn fee = new DataColumn("Fee", typeof(decimal));
billable.Columns.Add(fee);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
对于 child table:
var b= new DataTable("B");
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn parentId= new DataColumn("ParentId", typeof(int));
billable.Columns.Add(parentId);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
我还没有在两个 table 之间建立任何关系。我想知道如何以正确的方式做到这一点。
以下是我用于批量插入的代码:
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
try
{
bulkCopy.DestinationTableName = "dbo.A";
bulkCopy.WriteToServer(a);
bulkCopy.DestinationTableName = "dbo.B";
bulkCopy.WriteToServer(b);
}
catch (Exception ex)
{
Logger.Error(ex, "Bulk copy operation failed.");
}
}
SqlBulkCopy
没有 return 身份值。因此,除非您的 table A
有另一个独特的列,例如 "Code" 以允许完善 SELECT
,否则您将无法检索生成的标识值。
免责声明:我是项目的所有者Bulk Operations
这个库不是免费的,但允许输出标识值。它在引擎盖下使用 SqlBulkCopy
和 Temporary Table
以允许此功能
using (var bulkCopy = new BulkOperation(connection))
{
bulkCopy.Transaction = transaction;
bulkCopy.DestinationTableName = "dbo.A";
bulkCopy.ColumnMappings.Add("Id", ColumnMappingDirectionType.Output);
bulkCopy.ColumnMappings.Add("Col1");
bulkCopy.ColumnMappings.Add("Col2");
bulkCopy.BulkInsert(a);
// Copy identity value in `Id` from table A to `ParentId` in table B
// ...code...
}
我不会使用身份 link 这两个表,而是使用 GUID link 它们。像这样:
var a= new DataTable("A");
DataColumn guid= new DataColumn("Guid", typeof(Guid));
billable.Columns.Add(Guid.NewGuid());
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn fee = new DataColumn("Fee", typeof(decimal));
billable.Columns.Add(fee);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
然后是children
var b= new DataTable("B");
DataColumn id= new DataColumn("Id", typeof(int));
billablePriceMapId.AutoIncrement = true;
billable.Columns.Add(id);
DataColumn parentId= new DataColumn("ParentGuid", typeof(Guid));
billable.Columns.Add(parentGuid);
DataColumn[] keys = new DataColumn[1];
keys[0] = id;
billable.PrimaryKey = keys;
这意味着您知道 link 在插入之前、在生成标识之前会是什么。