亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 176 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號