Как получить идентификаторы вставленных записей данных с помощью SQL bulk copy

ado.net database identity sqlbulkcopy sql-server

Вопрос

У меня есть ADO.NET DataTable с около 100 000 записей. В этой таблице есть столбец xyID который не имеет в нем значений, потому что столбец является автоматически сгенерированным IDENTITY в моей базе данных SQL Server.

Мне нужно получить сгенерированные идентификаторы для других процессов. Я ищу способ массового копирования этой DataTable в базу данных SQL Server и в рамках того же «шага», чтобы «заполнить» мой DataTable сгенерированными идентификаторами.

Как получить идентификационные значения записей, вставленных в таблицу, используя класс SqlBulkCopy ?

Популярные ответы

В настоящее время я делаю что-то вроде этого:

DataTable objects = new DataTable();
DataColumn keyColumn = new DataColumn("name", typeof(string));
DataColumn versionColumn = new DataColumn("version", typeof(int));
versionColumn.DefaultValue = iVersionID;

objects.Columns.Add(keyColumn);
objects.Columns.Add(versionColumn);

foreach (KeyValuePair<string, NamedObject> kvp in Directory)
{
    NamedObject o = kvp.Value;
    DataRow row = objects.NewRow();
    row[0] = o.Name;
    objects.Rows.Add(row);
}

using (SqlBulkCopy updater = new SqlBulkCopy(conn,
        SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction, null))
{
    updater.DestinationTableName = "object_table";
    updater.WriteToServer(objects);
}

string sQuery = @"SELECT id, name FROM object_table WHERE version = @ver";
using (SqlCommand command = new SqlCommand(sQuery, conn))
{
    SqlParameter version = new SqlParameter("@ver", SqlDbType.Int, 4);
    version.Value = versionID;
    command.Parameters.Add(version);

    command.CommandTimeout = 600;

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            string key = (string)reader[1];

            NamedObject item = Directory[key];
            item.ID = (int)reader[0];
        }
    }
}

Обратите внимание: наша конструкция данных позволяет фильтровать все наши новые объекты с помощью идентификатора версии; каждая добавляемая строка будет иметь тот же идентификатор версии, и мы ранее удалили любые строки в базе данных, у которой уже был этот идентификатор версии.

Однако мой запрос выбора в настоящее время отключается в ExecuteReader, даже с этим 10-минутным окном. Так что это не наше окончательное решение.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему