Поддерживает ли SqlBulkCopy Graphtables в MsSql 2017?
Я пробую новую поддержку базы данных графов, которая была добавлена в Microsoft SQL Server 2017. Я хотел использовать SqlBulkCopy, чтобы вставить пару тысяч узлов в таблицу узлов. Однако я всегда ошибаюсь: Column '$node_id_DB218B0EAE294E37804103CF4E82BCD2' does not allow DBNull.Value.
Мои таблицы созданы, как это
CREATE TABLE [Product] (
[id] bigint,
[name] nvarchar(max),
[partsNum] bigint,
[price] float) AS NODE;
CREATE TABLE [DependsOn] (
[weight] float,
[id] bigint) AS EDGE;`
Я готовлю свой datatable со всеми атрибутами и вызываю SqlBulkCopy следующим образом:
using (var bulkCopy = new SqlBulkCopy(Connection, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers, null)
{
DestinationTableName = "Product"
})
{
bulkCopy.WriteToServer(_dataTable);
}
Теперь мне интересно, делаю ли я что-то не так или это просто пока не поддерживается.
1 ответ
SqlBulkCopy
не имеет специальной обработки для DataTable
; он сопоставит столбцы для копирования из источника в место назначения по порядковому положению, так же как и для других перегрузок, которые принимают другие источники. Поэтому настройка сопоставления идентификаторов по имени не является обязательной:
foreach (DataColumn c in dataTable.Columns) {
sqlBulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
}
В случае таблиц графиков и узлов проблема несколько заметнее, чем обычно, поскольку внутренние столбцы, поддерживающие структуры (которые вы обычно не используете явно), появляются в начале списка столбцов, что практически гарантирует сбой.