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);
现在我想知道是我做错了什么还是现在还不支持。
【问题讨论】:
您没有分配任何.ColumnMapping
s。您可能想要这样做,否则SqlBulkCopy
会做坏事,例如假设所有列都需要批量复制,并且完全按照表中给出的顺序进行。图表包含一些内部创建的列,这些列肯定会破坏这一点。 (您可能认为SqlBulkCopy
足够聪明,可以按名称映射列,而无需在传递DataTable
时告诉它。不幸的是,事实并非如此。)
哦,如果数据表具有完全相同的列,我希望它不需要映射。让我尝试添加它。
你是对的。是缺少映射...您要发布答案以便我标记它吗?
我觉得应该有这个问题的副本(不一定专门关于图表),但按照惯例,似乎不可能在 SO 上找到一个......所以我也可以。如果有人发现了骗子,请适当关闭。
【参考方案1】:
SqlBulkCopy
对DataTable
没有特殊处理;它将按序号位置映射要从源复制到目标的列,就像它对采用其他源的其他重载所做的那样。因此,按名称设置身份映射不是可选的:
foreach (DataColumn c in dataTable.Columns)
sqlBulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
对于图形和节点表,问题比平时更明显,因为支持结构的内部列(您通常不明确使用)出现在列列表的 start 处,所以这几乎可以保证失败。
【讨论】:
以上是关于SqlBulkCopy 是不是支持 MsSql 2017 中的图形表?的主要内容,如果未能解决你的问题,请参考以下文章
如何避免 MSSql 2000 中出现错误“已存在与此命令关联的打开 DataReader”