我有一个带有SQLServer后端的数据库,该数据库是从Access和Access前端迁移的。在迁移之后我遇到的一个问题是,在保存记录之后才会生成自动编号(有点明显,但Access似乎并不关心)。我有一个表单打开以在表中创建一个新记录,但该表单的元素需要该新记录的自动编号(标识)字段的值来计算事物。我想以某种方式获得这个数字,因为表单加载而不是必须保存它并重新打开它只是为了获得这个数字。最好的方法是什么?提前致谢。
答案 0 :(得分:1)
您所指的是Access中的AutoNumber列,它是SQL中的Identity字段。
在SQL中实现此功能的唯一方法是在表单打开时插入记录,然后使用SQL中的@@ Identity检索最新值。
当您的Access应用程序与数据库结合在一起时,Access实际上是在为您执行此操作。您可以查看以下链接以获取更多详细信息。
http://bytes.com/topic/sql-server/answers/143378-identity-sql-vs-autonumber-access
答案 1 :(得分:1)
访问数据库返回+在记录脏时生成自动编号。在SQL Server + Access的情况下,您不能使用,表单也不会显示自动编号UNTIL记录的保存时间。 简单的解决方案是强制保存表单数据,然后您拥有的任何后续/现有代码将继续工作。
所以你的代码看起来像这样:
If Me.NewRecord = True Then
Me.Dirty = False
End If
只要进行了某些编辑,上述操作就会起作用。请注意,如果没有编辑,上面将不会生成自动编号ID(但即使在非SQL服务器数据库中,如果没有编辑,则无论如何都不能使用自动编号)。
以上适用于绑定表单。如果您有reocrdset代码,那么您可以更改类似的代码:
Set rstRecords = CurrentDb.OpenRecordset("tblmain")
rstRecords.AddNew
在上面你的VBA代码可以/可以抓取自动编号。但是,上面的sql sever代码必须强制保存。
实际上,适用于ACE或SQL服务器的代码是:
将成为: Dim rstRecords作为DAO.Recordset Dim lngNext As Long
Set rstRecords = CurrentDb.OpenRecordset("tblmain", dbOpenDynaset, dbSeeChanges))
rstRecords.AddNew
' code here does whatever
rstRecords.Update
rstRecords.Bookmark = rstRecords.LastModified
lngNext = rstRecords!ID
rstRecords.Close
所以简单的“问题”是你需要写出记录来强制SQL服务器生成auotnumber。完成此记录保存后,您的表单和大多数VBA代码应“按原样”运行。你不需要"度假"其他代码,例如select @@ identity,除非你使用SQL insertcommands而不是上面的表单或记录集代码。
答案 2 :(得分:0)
如果它在一个绑定的表单上,给出一个保存按钮,它将记录保存到Master表的数据库。除了identity字段的值之外什么也没有。然后启用或显示需要来自此主表/表单的ID的子表单。
看起来@@身份代码可能因为它的绑定形式而无法使用。为了说服用户在将任何数据添加到表单之前需要保存的原因,我将按钮“显示详细信息”或“将数据添加到详细信息”,这将使用表单上的docmd保存记录,并使详细信息部分可见。
DoCmd.RunCommand acCmdSaveRecord
'或其他不同的代码段,只需更新表单的脏状态
即可If Me.Dirty = True then
Me.Dirty = False
End If
'您可以编写代码来显示/显示详细信息部分/子表单