【问题标题】:Microsoft Access to SQL Server Transition - Invalid use of null on insertMicrosoft Access 到 SQL Server 转换 - 插入时无效使用 null
【发布时间】:2020-01-21 06:38:30
【问题描述】:

我正在迁移旧版 Microsoft Access 应用程序以使用 SQL Server 作为后端。我注意到自从切换到 SQL Server 后,所有插入操作都出现了无效使用 null 错误。

通过一些测试,我发现这是由于 VBA 的编写方式造成的。主键在创建记录之前被引用,因此它为空也就不足为奇了。

Dim recordSet  As DAO.Recordset
Dim newID As Long

Set recordSet = dbLocal.OpenRecordset("Select * FROM tblUser", dbOpenDynaset, dbSeeChanges)
 With recordSet
  .AddNew
   newID = !UserID
  .Update
 End With
recordset.Close

现在这在旧的 Access to Access 应用程序中运行良好。它是如何做到这一点的,我怎样才能使它与新的 SQL Server 后端一起工作? (我知道我可以将代码更改为不引用它,但是这会在应用程序中多次发生,因此我不希望这样做)。

【问题讨论】:

  • 检查 Access DB 中列的默认值,以及此代码是否正确复制到 SQL Server 并使用 CONTRAINTS
  • UserID 是 IDENTITY(Access 中的自动编号)列吗?
  • 是的,该值无疑来自 SQL Server 标识列之类的东西。在执行 .Update 之前,它不会被赋值。如果将 .Update 行放在检索值的行之前,是否会出现问题?
  • @Andre 是的,它是 Access 中的自动编号列
  • @GregLow 是的,它工作正常

标签: sql-server vba ms-access null ms-access-2010


【解决方案1】:

我很惊讶这能奏效。正确的做法是这样的:

With myRecordSet
    .AddNew
    ' Set all data columns (not the IDENTITY column)
    !Data = someData
    ' Save new record
    .Update

    ' Move the recordset pointer to the new record to read its ID
    .Bookmark = .LastModified
    newID = !UserID
    ' Done
    .Close
End With

https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/recordset-lastmodified-property-dao

【讨论】:

  • 那么如果不更改它插入 SQL 的所有实例就没有办法解决这个问题?
  • 不,你必须这样做。 @varilight
  • 嗯,即使在非常大的迁移中,我也只找到了大约 4-5 个地方。对于任何不需要拾取PK“id”的插入,那么代码确实不需要更改。所以,是的,你必须修改任何执行 .addNew 的代码,然后选择你必须按照上面的书签保存的 PK 自动编号。查看最近的一次迁移,在大约 40 个地方中,只有大约 4 个在获取该 PK id,其余的不需要任何代码更改。同样的问题出现在表单上 - 如果需要 PK,me.Dirty = False 将强制出现 write 和 autoumber。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2011-09-28
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多