mysql - 如何从 MySQL 数据库中获取最后的插入值并更新 Access 中的字段?

标签 mysql vba forms ms-access last-insert-id

我有一个涉及人体遗骸的复杂数据库,所以输入数据的Access表单也很复杂。我有几个子表单(Skeleton_index、Element_index 和其他几个)。我提到的两个子表单将数据发送到未绑定(bind)主表单上它们各自的字段(element_link、skeleton_link),数据从那里被其他表单使用。对于 Skeleton_index,用户必须输入个人姓名,它会立即显示在 skeleton_index 字段中。我遇到的问题是我不希望用户必须输入 Element_index 的主键数据,因为它应该是 auto_increment。这是一个问题,因为 Element_id 中的自动增量值不会立即显示在 element_link 字段中。为了让它显示出来,用户必须创建一个新元素,然后返回到他们正在编辑的元素。我想避免这种情况。

我想要做的是在获得焦点时将 Element_id 文本框更新为新的 auto_increment 主键。 VBA 代码应从 MySQL (InnoDB) Element_index 表中获取最后一个主键,向其添加一个,然后更新 Element_index 表单中 Element_id 字段中的值。

这是我的尝试,但完全失败了。

Private Sub Element_id_GotFocus()
    SQL = "SELECT LAST_INSERT_ID();"
    lastID = DoCmd.RunSQL(SQL)
    newID = Int(lastID) + 1
    Element_id.Value = newID
End Sub

编辑:

数据库在第一个实例中只有一个用户,但将来可能会有更多。

解决方案: 我添加了一个带有两个宏的按钮:一个用于保存插入的记录,另一个用于刷新表单。无需复杂的 VBA。

最佳答案

您的尝试在很多方面都是错误的。主要是:

  1. 您不能使用 DoCmd.RunSQL 运行选择查询。它仅运行操作查询。
  2. 您需要使用直通查询来运行包含 MySQL 特定函数的查询。
  3. 您不能使用 LAST_INSERTED_ID(),除非您在用于向您感兴趣的表中插入行的同一连接上执行它。

最好使用 QueryDef 执行直通查询,并使用 INFORMATION_SCHEMA.TABLES 表检索下一个自动编号:

'Create a new temporary query, uses `With` instead of storing it in a variable
With CurrentDb.CreateQueryDef("")
    'Make it a pass-through query that connects to MySQL
    .Connect = "ODBC;<enter connection string here>"
    'Set the SQL for the query: queries table definition, gets auto_increment seed
    .SQL = "SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ""<table name here>"" AND TABLE_SCHEMA = ""<database name here>"""
    'The query should return records (not an action query)
    .ReturnsRecords = True
    'Execute the query, get the results into a snapshot-type recordset
    'And set your field equal to the first column of the first row of the recordset
    Element_id.Value = .OpenRecordset(dbOpenSnapshot).Fields(0).Value
End With

关于mysql - 如何从 MySQL 数据库中获取最后的插入值并更新 Access 中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52001604/

相关文章:

php - 为 php5 下载 php_mysql.dll

vba - 如何在 Excel 中打开特定版本的 Word 2007/2010

mysql - 根据一列或两列选择所有重复行?

PHP PDO 基本准备语句

javascript - 用VBA处理IE弹窗

excel - 转至第一张未隐藏的工作表

forms - 在Angularjs中禁用按钮时如何允许ng-click

JavaScript 不显示

javascript - 如何在 dropzone.js 中沿着文件上传提交附加数据?

mysql - 获取不同时间段的数据