【问题标题】:Does SqlBulkCopy support Graphtables in MsSql 2017?SqlBulkCopy 是否支持 MsSql 2017 中的图形表?
【发布时间】:2019-06-17 06:17:02
【问题描述】:

我正在试用新的graphdatabase support that was added to 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;`

我准备了一个包含所有属性的数据表并像这样调用 SqlBulkCopy:

using (var bulkCopy = new SqlBulkCopy(Connection, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers, null)
{
    DestinationTableName = "Product"
})
{
    bulkCopy.WriteToServer(_dataTable);
}

现在我想知道是我做错了什么还是现在还不支持。

【问题讨论】:

  • 您没有分配任何.ColumnMappings。您可能想要这样做,否则SqlBulkCopy 会做坏事,例如假设所有列都需要批量复制,并且完全按照表中给出的顺序进行。图表包含一些内部创建的列,这些列肯定会破坏这一点。 (您可能认为SqlBulkCopy 足够聪明,可以按名称映射列,而无需在传递DataTable 时告诉它。不幸的是,事实并非如此。)
  • 哦,如果数据表具有完全相同的列,我希望它不需要映射。让我尝试添加它。
  • 你是对的。是缺少映射...您要发布答案以便我标记它吗?
  • 我觉得应该有这个问题的副本(不一定专门关于图表),但按照惯例,似乎不可能在 SO 上找到一个......所以我也可以。如果有人发现了骗子,请适当关闭。

标签: c# sql-server-2017 sqlbulkcopy sql-graph sql-server-2017-graph


【解决方案1】:

SqlBulkCopyDataTable 没有特殊处理;它将按序号位置映射要从源复制到目标的列,就像它对采用其他源的其他重载所做的那样。因此,按名称设置身份映射不是可选的:

foreach (DataColumn c in dataTable.Columns) {
    sqlBulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
}

对于图形和节点表,问题比平时更明显,因为支持结构的内部列(您通常不明确使用)出现在列列表的 start 处,所以这几乎可以保证失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-08
    • 2019-03-01
    • 2012-08-23
    • 2019-03-10
    • 1970-01-01
    • 2018-07-14
    • 2017-07-28
    • 2017-12-05
    相关资源
    最近更新 更多