【问题标题】:How to set a date/time in front-end access that is compatible with back-end SQL?如何在前端访问中设置与后端 SQL 兼容的日期/时间?
【发布时间】:2016-06-26 07:02:24
【问题描述】:

我们使用 Access 2016 作为前端,使用 SQL Server 2008 作为后端。

用户在表单中创建新记录。为了为这条新记录生成一个自动编号的 ID,我使用 DoCmd.RunCommand acCmdSaveRecord。当我使用此命令时,表单会从该记录中移出。然后我需要找到刚刚创建的记录的 ID。我无法搜索最大的自动编号 ID,因为我们使用合并复制并且不同的用户有不同的 ID 范围。

我尝试在 SQL Server 中使用 GetDate() 创建一个 DateCreated 列并将该列默认为当前日期和时间,但这会使 Access 出现锁定错误和其他错误,因为它无法正确读取 SQL Server 的日期时间格式.

是否有一个.saverecord 选项不会移出表单中的当前记录?或者在使用 SQL Server 后端和 Access 前端时是否存在不会产生错误的日​​期/时间字段?

简而言之,我需要在表单中创建的最后一条记录的自动编号 ID。

【问题讨论】:

  • 该命令不应将表单移出记录。你最好使用 if me.Dirty = True 然后 me.Dirty = false。

标签: sql-server-2008 datetime ms-access


【解决方案1】:

在插入记录后使用传递查询运行此 SQL 语句:

SELECT SCOPE_IDENTITY() AS ID

它将返回当前范围内使用的最后创建的身份。

【讨论】:

  • 用于获取本地 Access 表的最新标识,但您必须调用它才能使用 VBA 中的传递记录集从 SQL Server 获取它
  • 啊,我以前从未这样做过...从 VBA 调用 SQL Server。我想是时候离开我舒适的 VBA 外壳了。看来我需要打开与 SQL 的连接,然后查询表。将尝试这个,谢谢!
  • 不,您不必离开 VBA 部分,除非某个对访问零了解的人尝试在零知识的情况下提出有关 Access 的建议。当表单保存记录时,自动编号 ID 在表单记录集中可用,并且可以像该表单中的任何其他列一样引用该值 (me!ID)。这里唯一令人困惑的部分是为什么当您保存记录时表单会从记录中移出——它不应该。这样的表还应该有一个时间戳列(sql rowversion)。至于如何以绑定形式执行选择命令,这是一个问题 - 它不是必需的。
【解决方案2】:

要让自动编号字段填充到绑定到 sql server 表的 Access 表单中,您只需强制表单保存记录。保存记录的行为不会也不应该也不会将表格移出记录。

获取自动编号的代码如下:

If me.Dirty = True then  Me.Dirty = false
Debug.print "Auto number from SQL server = " & me!id

作为一般规则,您不能使用 SELECT SCOPE_IDENTITY(),因为表单中使用的连接与用于执行 SQL 传递查询的连接不同。所以这里的反应是野鹅追逐和解决这个问题的不正确和错误的方法。

【讨论】:

    【解决方案3】:

    在同一会话中运行另一个命令以获取 id: SELECT @@IDENTITY

    有关更多详细信息,请查看:MSDN 文档。

    无论如何,如果您有一个 API 来访问数据库,并且它没有公开它,则应该使用它来返回范围标识,因为这是知道生成了什么 ID 的唯一可靠方法。

    【讨论】:

    • 我在VBA前端编码,没有在SQL数据上运行程序。 VBA 代码中是否有这样的等价物?
    • 你只需要在同一个会话中运行另一个查询来获取@@IDENTITY - 检查this
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多