如何从mysql数据库获取最后一个insert值并更新access中的字段?

mcdcgff0  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(294)

我有一个涉及人类遗骸的复杂数据库,因此输入数据的访问表单也相当复杂。我有几个子窗体( backbone 索引、元素索引和其他一些)。我提到的两个子窗体名称将数据发送到未绑定主窗体上各自的字段(element\u link、skeleton\u link),其他窗体将从中使用数据。对于skeleton\u index,用户必须输入个人的姓名,它会立即显示在skeleton\u index字段中。我的问题是,我不希望用户必须输入元素索引的主键数据,因为它应该自动递增。这是一个问题,因为element\u id中的自动递增值不会立即显示在element\u link字段中。为了让它显示出来,用户必须创建一个新元素,然后返回到他们正在编辑的元素。我想避免这样。
我要做的是在获得焦点时将element\u id文本框更新为一个新的自动增量主键。vba代码应该从mysql(innodb)element\u index表中获取最后一个主键,向其中添加一个,然后更新element\u index表单中element\u 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。

vnzz0bqm

vnzz0bqm1#

当id无效时,我依赖于错误。
首先获取max(id),然后递增,最后用递增的id执行insert query。如果没有错误,您就有fk的id,在错误处理时(例如,用下一个增量重试)

On Error Goto myErrHandler
Dim newID as Long
newID = Nz(DMax("ID","myTable"),0) + 1
With CurrentDb()
    .Execute "INSERT INTO myTable (ID) Values (" & newID & ")", dbFailOnError
End With
'...
' here code for inserts in tables with ID as FK
xeufq47z

xeufq47z2#

你的尝试在很多方面都是错误的。主要有:
你不能使用 DoCmd.RunSQL 运行选择查询。它只运行操作查询。
您需要使用passthrough查询来运行包含mysql特定函数的查询。
你不能使用 LAST_INSERTED_ID() 除非您在用于向感兴趣的表中插入行的同一连接上执行它。
最好使用querydef执行passthrough查询,并使用information\u 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

相关问题