SqlBulkCopy 是不是支持 MsSql 2017 中的图形表?

Posted

技术标签:

【中文标题】SqlBulkCopy 是不是支持 MsSql 2017 中的图形表?【英文标题】: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 上找到一个......所以我也可以。如果有人发现了骗子,请适当关闭。 【参考方案1】:

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

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

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

【讨论】:

以上是关于SqlBulkCopy 是不是支持 MsSql 2017 中的图形表?的主要内容,如果未能解决你的问题,请参考以下文章

不支持关键字:带有 SqlBulkCopy 的“提供者”

如何避免 MSSql 2000 中出现错误“已存在与此命令关联的打开 DataReader”

SqlBulkCopy只支持SQL Server? EF Core实现支持多数据库类型的Bulk Copy

用SqlBulkCopy批量插入数据 遇到的错误

百万次插入:SqlBulkCopy 超时

GSS-API MSSQL JDBC 驱动程序