使用 SQL 后端维护表单中的自动编号功能

Maintaining AutoNumber functionality in a form while using SQL backend

目前,我正在尝试将我的数据库从 Access 后端迁移到 SQL 后端,同时仍将 Access 表单作为前端。这是通过链接 tables 和 ODBC 连接到我的后端来完成的。该表单旨在向 table 添加新记录。问题出在自动编号上。 ID 被设置为自动编号,表单将在等待用户添加剩余列时简单地显示 (New)。我已经使用 IDENTITY 属性 设置了我的 SQL 数据,因此一旦创建新记录,它就会递增。但是,我无法使表单的行为方式与原来相同,因为即使后端会自动添加下一个顺序 ID,我也无法在用户实际保存表单数据之前自动将该数据填充到表单中。有没有办法维护 AutoNumber 提供的表单功能?

TL;DR:自动编号更改为数字后,表单无法正常工作。

解决方案

对于这个问题,我需要在 SQL 后端将我的 identity_insert 设置为 ON。这是这样做的代码:

SET IDENTITY_INSERT tableName ON;

此外,如果您遇到错误:Table <Table Name> does not have the identity property. 重新创建 table,其中的自动递增列具有标识。

示例:

CREATE TABLE new_employees  (id_num int IDENTITY(1,1), fname varchar (20), minit char(1),  lname varchar(30));

Microsoft 官方文档中有关 IDENTITY 的更多信息:here

好吧,在 "rare" 情况下,您实际上需要在保存记录之前使用自动编号器。例如,如果您有一个子表单,那么 Access 总是会自动保存主记录,因此自动编号已经并且将会被创建。所以一个主表单和一个子表单(child table)将工作正常,无需代码。

现在,有些情况下您需要自动编号。假设您有一些 "code" 需要 运行 并吐出一些子记录。

一般的做法是在那个时间点简单地执行一次记录保存。

所以,假设有一个按钮,或者您需要在表单中 运行 一些代码,并且您需要 PK 自动编号?

您可以使用此代码:

If isnull(me!ID) = true then
   me.dirty = false  ' force record save - autonumber now created
end if

上面的记录必须是 "dirty",但在几乎所有情况下,情况都是如此。 "rare" 异常会建议您检查 me.IsNewRecord,但在大多数情况下,上面的代码就足够了。

我真的无法想象某些自动编号的 "display" 在用户开始输入数据时如此重要。

但是,如果您希望自动编号出现在任何按键(表单上的数据输入)之后?

简单的把这行代码放在after insert事件中:

me.dirty = false

因此,现在在查看表单时,用户在任何文本框中按下的第一个键都会强制生成并显示自动编号。但是,将自动编号 ID 的任何含义分配给最终用户是一种非常糟糕的做法。事实上,在大多数情况下,ID 应该被隐藏。

以上唯一的问题或缺点当然是,如果您有任何必需的列,则以上可能会出错或出现问题。