Sql server 2008 如何在前端访问中设置与后端SQL兼容的日期/时间?
我们使用Access 2016作为前端,SQL Server 2008作为后端 用户在表单中创建新记录。为了为这个新记录生成一个自动编号的ID,我使用了Sql server 2008 如何在前端访问中设置与后端SQL兼容的日期/时间?,sql-server-2008,datetime,ms-access,Sql Server 2008,Datetime,Ms Access,我们使用Access 2016作为前端,SQL Server 2008作为后端 用户在表单中创建新记录。为了为这个新记录生成一个自动编号的ID,我使用了DoCmd.RunCommand acCmdSaveRecord。当我使用此命令时,窗体将从该记录中移出。然后我需要找到刚刚创建的记录的ID。我无法搜索最大的自动编号ID,因为我们使用合并复制,并且不同的用户具有不同的ID范围 我尝试创建一个DateCreated列,并通过在SQL Server中使用GetDate()将该列默认为当前日期和时间,
DoCmd.RunCommand acCmdSaveRecord
。当我使用此命令时,窗体将从该记录中移出。然后我需要找到刚刚创建的记录的ID。我无法搜索最大的自动编号ID,因为我们使用合并复制,并且不同的用户具有不同的ID范围
我尝试创建一个DateCreated
列,并通过在SQL Server中使用GetDate()
将该列默认为当前日期和时间,但这会导致Access出现锁定错误和其他错误,因为它无法正确读取SQL Server的日期时间格式
是否有一个.saverecord
选项不从表单中的当前记录中移出?或者,在使用SQL Server后端和Access前端时,是否存在不会产生错误的日期/时间字段
简而言之,我需要表单中创建的最后一条记录的自动编号ID 插入记录后,使用传递查询运行此SQL语句:
SELECT SCOPE_IDENTITY() AS ID
它将返回在当前作用域中使用的上次创建的标识。在同一会话中运行另一个命令以获取标识:
选择@@IDENTITY
有关更多详细信息,请查看:文档
无论如何,如果您有一个API来访问数据库,但它没有公开这个API,那么应该使用它来返回作用域标识,因为这是知道生成了什么ID的唯一可靠方法 要在绑定到sql server表的Access窗体中填充自动编号字段,只需强制窗体保存记录即可。保存记录的行为不会也不应该也不会将表单移出记录 因此,获取自动编号的代码为:
If me.Dirty = True then Me.Dirty = false
Debug.print "Auto number from SQL server = " & me!id
通常不能使用SELECT SCOPE_IDENTITY(),因为表单中使用的连接与执行SQL传递查询时使用的连接不同。因此,这里的回答是徒劳的追逐和不正确的和错误的方式来处理这个问题 我在VBA前端编码,而不是在SQL数据上运行程序。VBA代码中是否有类似的内容?您只需在同一会话中运行另一个查询即可获取@@IDENTITY-检查是否有用于获取本地访问表的最新标识的内容,但您必须调用此函数,才能使用VBAAHH中的传递记录集从SQL Server获取它。我以前从未这样做过…从VBA调用SQL Server。我想是时候离开我舒适的VBA外壳了。似乎我需要打开与SQL的连接,然后查询表。我会尝试一下的,谢谢!不,您不必离开VBA部分,除非某个对access一无所知的人尝试在没有任何知识的情况下提出有关access的建议。当表单保存记录时,自动编号ID在表单记录集中可用,并且该值可以像该表单中的任何其他列(me!ID)一样被引用。这里唯一令人困惑的是,为什么在保存记录时表单会从记录中移出——它不应该这样做。此类表还应具有时间戳列(sql rowversion)。至于如何在绑定表单中执行select命令,这个问题是不需要的。该命令不应将表单移出记录。你最好用if me.Dirty=True然后用me.Dirty=false。