Как указать внешние ключи между двумя таблицами DataTable в операции группового копирования SQL? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть две таблицы данных A и B. A является родительской таблицей.Строки в B содержат поле ParentId, которое ссылается на A.

Я хочу выполнить массовую вставку A и B отдельно.После вставки A как установить ParentId в соответствующих дочерних строках в B?

Обновление:

У меня есть следующий код для создания таблиц данных:

    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 ]

0 голосов
/ 13 сентября 2018

Я бы не использовал идентичность для связи двух таблиц, скорее, я бы использовал 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;

Это означает, что вы знаете, какой будет ссылка до вставки, до того, как будет сгенерирован идентификатор.

0 голосов
/ 13 сентября 2018

SqlBulkCopy не возвращает идентификационные значения. Поэтому, если в вашей таблице A нет другого уникального столбца, такого как "Код", который позволяет усовершенствовать SELECT, вы не сможете получить сгенерированные значения идентификаторов.

Отказ от ответственности : я владелец проекта Массовые операции

Эта библиотека не является бесплатной, но позволяет выводить значения идентификаторов. Он использует под капотом 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...
}
...