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