3

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

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

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

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

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

4

3 回答 3

3

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

SET IDENTITY_INSERT table ON

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

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

同样,不要忘记将其关闭:

SET IDENTITY_INSERT table OFF

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

批量导入数据时保留标识值

于 2010-03-18T14:10:52.340 回答
2

仅使用插入尝试时:

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

当批量复制数据时,您需要在命令上添加特殊参数/开关/提示,它们在此处详细说明:

批量导入数据时保留标识值

于 2010-03-18T14:11:39.203 回答
0

好的,这是解决我问题的代码。谢谢马库斯和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()
于 2010-03-18T15:51:58.477 回答