【问题标题】:Adding Data To DataTable not knowing Primary Key Value在不知道主键值的情况下将数据添加到 DataTable
【发布时间】:2014-09-04 12:45:15
【问题描述】:

我用 VB 编写了一个程序(虽然我对 C# 也同样熟悉,所以请用任何一种语言回答),用于将大量数据插入到我的 SQL 服务器数据库中的表中。

我打算这样做的方式是:

  1. 使用SqlDataAdapter.FillSchema 方法从数据库中获取表的架构。
  2. 将多行数据添加到我的 DataTable 中
  3. 使用SqlBulkCopy (.WriteToServer(dtToCopy.CreateDataReader)) 加载数据

我之前已经做过很多次了,事实证明它非常有效。我的问题是我要写入的表有一个自动递增的主键列RowNum

现在我知道我可以在获取架构后重新查询我的表并获得RowNum 的最新值,然后只需将值自己写入我的​​ DataTable 的相应列中,但我担心表可能会改变在我的查询时间和我的写作时间之间,在这种情况下,我可能会得到不理想的结果。

我看过与MissingSchemaAction > AddWithKey 相关的帖子,但我不确定在我的情况下如何实现它?

我是否只需删除主键并从我的 DataTable 中删除 RowNum 列? 如果是这样,我应该在什么时候设置该属性?它似乎不是 DataTable 的属性,我看不到在 SqlBulkCopy 中添加它的位置。

谢谢!!!

【问题讨论】:

  • 您的 DataTable 当前是否有该 RowNum 列,如果有,是否有“默认”值或“可用”值?
  • @BernhardHiller,它使用FillSchema 命令从数据库中获取列,但它没有获取种子值...
  • 为大量数据创建数据表效率低下。假设您有 1000 万条记录,您不想将它们全部加载到内存中。您可能需要考虑使用数据阅读器:msdn.microsoft.com/en-us/library/434atets(v=vs.110).aspx
  • 谢谢@Neolisk,我也有这个程序。不过,对于这个特定的示例,我喜欢 DataTable,因为我还对它执行 Linq 查询并在我的其他地方的代码中使用它,但这是一个非常有用且合乎逻辑的建议。谢谢!
  • 你可以使用 Linq-To-Sql。

标签: c# sql-server vb.net datatable


【解决方案1】:

经过大量搜索,我自己找到了解决方案。

基本上,我必须:

  1. 将我的DataTable的PrimaryKey属性设置为Nothing
  2. 从我的 DataTable 中删除 RowNum
  3. ColumnMappings 用作我的SqlBulkCopy,以便映射所有其他列并省略标识

然后,由于它是主键并在数据库中设置为自动增量,因此在加载时会自动为其分配正确的值。

希望这对其他人有所帮助!!!

主要来源: SqlBulkCopy Insert with Identity Column

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 2011-07-29
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多