错误 3622 - 访问具有 IDENTITY 列的 SQL Server 表时,必须将 dbSeeChanges 选项与 OpenRecordset 一起使用

Posted

技术标签:

【中文标题】错误 3622 - 访问具有 IDENTITY 列的 SQL Server 表时,必须将 dbSeeChanges 选项与 OpenRecordset 一起使用【英文标题】:Error 3622 - You must use the dbSeeChanges option with OpenRecordset when accessing a SQL Server table that has an IDENTITY column 【发布时间】:2013-11-15 15:46:18 【问题描述】:

我正在运行 MS Access 2007,连接到 MS SQL 2008 R2 服务器。我有一个带有多选框的表单,用于更新所选服务器的多个字段的状态。目前我正在使用多选框中的 ServerName 字段。问题是可以有多个具有相同服务器名称的记录。所以为了解决这个问题,我想将它从 ServerName 更改为记录号 (ID)。当我这样做时,尽管 VB 给出了错误“错误 3622 - 在访问具有 IDENTITY 列的 SQL Server 表时,您必须使用带有 OpenRecordset 的 dbSeeChanges 选项”。我在不同的网站上查看了许多不同的帖子,但不知道如何在我的代码中实现这一点。当我使用 ServerName 时,该脚本运行良好,如果我转到 SQL 服务器并将字段更改为 Identity = False,它也运行良好。问题是我无法使用自动编号创建新记录。如果我在更新查询中对行号进行硬编码,它也可以完美运行。问题是我无法为使用数据库的每个人硬编码行号。该问题似乎仅与VB有关。 以下是我目前拥有的。如您所见,我尝试将 dbSeeChanges 添加到 Execute 行。

Private Sub btnRoarsStatus_Click()
Dim strSQL As String
Dim Criteria As String
Dim Itm As Variant

With Me.lstServerNames

    If .ItemsSelected.Count > 0 Then
          For Each Itm In .ItemsSelected
              Criteria = Criteria & "," & .ItemData(Itm)
           Next Itm

          ' remove leading comma
           Criteria = Mid(Criteria, 2)

           ' execute the SQL statement
            strSQL = "UPDATE buildsheet SET [Roars Status] = " & Chr(34) & _
            Me.cboRoarsStatus & Chr(34) & " WHERE ID IN(" & Criteria & ")"

            Debug.Print strSQL
         CurrentDb().Execute strSQL, dbSeeChanges

      Else
          MsgBox "You must select one or more items in the  list box!", _
                  vbExclamation, "No Selection Made"
                  Exit Sub
      End If
  End With
 MsgBox "Completed", vbExclamation, "Completed"
End Sub

【问题讨论】:

您在 where 子句中是否有错误,请打印您的 strSQL 调试结果? lstServerNames 可能有字符串值,所以 Criteria 将是一个字符串,而不是一个整数列表,例如 ID 的 1、2、3、4? 选择了 2 个 ID 的调试打印输出,因为 strSQL 是 UPDATE buildsheet SET [Roars Status] = "Submitted" WHERE ID IN(1670,1672) ID 的 1670,1672 是否存在于 buildsheet 表中,确定。 绝对。我进入 buildsheet 以验证记录是否更改。这些记录数字在那里。 我通过测试链接的 SQL Server 表成功了您的代码,请取消 CurrentDb() => CurrentDb.Execute 中的括号 【参考方案1】:

我有一个类似的删除语句问题,我想执行并通过以下方式解决它:

CurrentDb.Execute SqlStr, dbSeeChanges

注意CurrentDb后面缺少的()

【讨论】:

【参考方案2】:

对我来说是这样的:

CurrentDb.Execute strSQL, **dbFailOnError +** dbSeeChanges

dbFailOnError 是关键...

【讨论】:

【参考方案3】:

CurrentDb().执行 strSQL,someotherConstant,dbSeeChanges

我认为,someotherConstant 可能丢失了。

【讨论】:

不,您引用的 someotherConstant 是 RecordsetTypeEnum 常量,它指示要打开的 Recordset 的类型,与OpenRecordset() 一起使用,但不是Execute() as per this question。比较msdn.microsoft.com/en-us/library/office/… 和msdn.microsoft.com/en-us/library/office/…。

以上是关于错误 3622 - 访问具有 IDENTITY 列的 SQL Server 表时,必须将 dbSeeChanges 选项与 OpenRecordset 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

标识列的查询

SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON

sql server 2000 列添加identity标识 出现错误时,弹出警告,清除警告后再次输入数据,标识会丢失一个

无法添加表行,因为“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Users' 中插入标识列的显式值”错误

实体框架抛出无法在表中插入标识列的显式值...当 IDENTITY_INSERT 设置为 OFF 错误

ASP.NET MVC 错误 SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“用户”中插入标识列的显式值