为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 SQL 批量复制操作中指定两个数据表之间的外键?

如何在 SQL 批量复制操作中指定两个数据表之间的外键?

C#
烙印99 2022-01-15 19:38:45
我有两个数据表 A 和 B。A 是父表。B 中的行包含一个引用 A 的字段 ParentId。我想分别批量插入 A 和 B。插入A后,如何在B的对应子行中设置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;对于子表:    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;我没有在两个表之间建立任何关系。我想知道如何以正确的方式做到这一点。以下是我用于批量插入的代码: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.");                        }                    }
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我不会使用标识来链接两个表,而是使用 GUID 来链接它们。像这样 :


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;

然后为了孩子


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;

这意味着您在插入之前知道链接将是什么,在生成标识之前。


查看完整回答
反对 回复 2022-01-15
?
哔哔one

TA贡献1854条经验 获得超8个赞

SqlBulkCopy不返回标识值。因此,除非您的表A有另一个唯一列(例如“代码”)以允许完善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...

}


查看完整回答
反对 回复 2022-01-15
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信