Как выполнить массовую вставку данных в таблицу, если первичный идентификатор задан с последовательностью - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь использовать SqlBulkCopy, чтобы вставить количество строк в таблицу, в которой столбец Id установлен с последовательностью.Последовательность и таблица выглядят примерно так:

CREATE SEQUENCE [dbo].[MyTableId] 
 AS [int]
 START WITH 1
 INCREMENT BY 1
 MINVALUE -2147483648
 MAXVALUE 2147483647
 CACHE  10 
GO

CREATE TABLE [dbo].[MyTable](
    [Id] [int] NOT NULL,
    [SomeColumn] [int] NOT NULL,
    [AnotherColumn] [nvarchar](100) NOT NULL
  CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
  (
    [Id] ASC
  )
GO

ALTER TABLE [dbo].[MyTable] ADD
  CONSTRAINT [DF_MyTable_Id]
  DEFAULT (NEXT VALUE FOR [MyTableId]) FOR [Id]
GO

Код для импорта строк выглядит примерно так:

var table = new DataTable();

using (var adapter = new SqlDataAdapter($"SELECT TOP 0 * FROM dbo.MyTable", conn))
{
    adapter.Fill(table);
}

foreach (Data d in data)
{
    var row = table.NewRow();

    row["SomeColumn"] = d.someColumnValue;
    row["AnotherColumn"] = d.anotherColumnValue;

    table.Rows.Add(row);
}

using (var bulk = new SqlBulkCopy(conn))
{
    bulk.DestinationTableName = "dbo.MyTable";
    bulk.WriteToServer(table);
}

Сбой при записи данных на сервер, поскольку

System.InvalidOperationException: 'Column 'Id' does not allow DBNull.Value.'

Я попытался удалить столбец Id из определения таблицы, но это только отодвигает порядковые номера столбца на единицу.Я попытался установить для строки Id:

table.Columns["Id"].AutoIncrement = true;

, но при этом игнорируется последовательность и при повторных запусках импорта перезапускается значение автоинкремента с 0.

Как быЯ приказываю серверу генерировать новое значение Id, используя его последовательность?Или можно отдельно сгенерировать ряд значений для последовательности перед созданием новых строк в таблице?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...