【问题标题】:How to insert a DataTable with existing Key to a SQL Server Table如何将具有现有键的 DataTable 插入 SQL Server 表
【发布时间】:2011-01-29 01:09:31
【问题描述】:

我正在使用 VB.NET.. 我有一个名为“QUESTION”的 DataTable,包含 3 个字段:

  • QuestionNumber(唯一整数键)
  • 问题文本
  • 问题类型

在我的 SQL Server 数据库中,我创建了一个名为“QUESTION”的表,其中包含相同的字段。 QuestionNumber定义为整数唯一键,自增

现在,当我进行批量复制以将 DataTable 插入 SQL Server 时,数据库会覆盖 DataTable 中的 QuestionNumber 并生成新的(从 1 个增量 1 开始)。

如何更改我的数据库设置,将原始 QuestionNumbers 复制到数据库中?

【问题讨论】:

    标签: sql-server database vb.net datatable sqlbulkcopy


    【解决方案1】:

    查找 IDENTITY INSERT。你打开它。更新表格,然后将其关闭。

    SET IDENTITY_INSERT table ON
    

    请注意,您一次只能在一张桌子上使用它。如果您为另一张桌子打开它,它会在最后一张桌子上关闭。

    如果您插入的值高于现有的最大值,它会将自身重新设置为该值,以便所有新值都更大。

    再一次,别忘了关掉它:

    SET IDENTITY_INSERT table OFF
    

    如果您实际上是在执行 BULK INSERT,那么不要忘记 KEEPIDENTITY 限定符,它告诉服务器不要忽略您的身份值,否则,它将忽略您的身份值并为身份列生成新的值。

    Keeping Identity Values When Bulk Importing Data

    【讨论】:

    • 感谢您的快速回答。我尝试了这个解决方案,但现在我得到一个 SQL 错误:ex.Message “必须为表 'IMP_FRAGEN' 中的身份列指定显式值,无论是当 IDENTITY_INSERT 设置为 ON 还是复制用户插入 NOT FOR REPLICATION 身份时柱子。”字符串有人有想法吗?
    • 你有标识列的值吗?
    • 是的,我发现了问题。正如 KM 在下面的帖子中所写,批量复制命令需要另一个参数。谢谢马库斯!
    • @user296575 说Yes, I found the Problem. As KM wrote in the post below, the bulk copy command needs another parameter. Thank you Marcus!不应该感谢KM吗??
    • 我真的以为您指的是更一般意义上的批量复制,但我也认为您已经看到了 KM 的部分。我会把它添加到我的,使它更完整。谢谢KM。
    【解决方案2】:

    当只使用插入尝试时:

    SET IDENTITY_INSERT [your table] ON
    INSERT INTO [your table] (identityCol, col1,...) VALUES (identityCol, col1,...)
    SET IDENTITY_INSERT [your table] OFF
    

    在批量复制数据时需要在命令中添加特殊参数/开关/提示,这里有详细说明:

    Keeping Identity Values When Bulk Importing Data

    【讨论】:

      【解决方案3】:

      好的,这是解决我问题的代码。谢谢马库斯和 KM!

      ' set identity_insert to on to insert tables with key'
              Command = New SqlCommand("SET IDENTITY_INSERT table ON", con)
              Command.ExecuteNonQuery()
      
      
      'Copy dataTable into MSSQL database'
       Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(cn, SqlBulkCopyOptions.KeepIdentity)
                  bulkCopy.DestinationTableName = dTable.TableName
                  Try
                      bulkCopy.WriteToServer(dTable)
                  Catch ex As Exception
                      Console.WriteLine(ex.Message)
                  End Try
              End Using
      
              'disable identity_insert'
              Command = New SqlCommand("SET IDENTITY_INSERT table OFF", con)
              Command.ExecuteNonQuery()
      

      【讨论】:

        猜你喜欢
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        • 2014-01-24
        • 1970-01-01
        相关资源
        最近更新 更多