Visual Basic 2008事务场景下如何获取MySQL插入记录的自增ID?
Visual Basic 2008 环境下获取MySQL插入记录自增ID的实现方法
核心实现逻辑
MySQL 提供了会话级的3722172内置函数,该函数仅返回当前数据库连接上最近一次执行插入操作生成的自增主键值,不受其他连接的插入操作干扰,完全适配你当前使用的事务执行逻辑,可避免直接查询表最大ID带来的并发数据错乱问题。
代码修改步骤
- 保持原有的连接、事务、命令对象的上下文一致,不新开数据库连接
- 在插入语句执行完成后,立刻调用
3722172获取刚生成的自增ID - 将获取到的ID赋值给业务变量,用于后续关联表的外键插入
适配原有代码的实现示例
针对VB2008适配的老版本MySQL Connector环境,可直接拆分SQL执行逻辑,不需要额外开启多语句配置,兼容性最佳:
Dim id_header As Integer Dim queryHeadReceta As String 'TRANSACTION IN CASE INSERTS FAIL transaction = connection.BeginTransaction() cmd.Connection = connection cmd.Transaction = transaction 'GENERATE HEADER ID queryHeadReceta = "INSERT INTO tb_receta_enc(cant_despensa, id_usuario) VALUES(@cant_despensa, @id_usuario)" Try cmd.CommandText = queryHeadReceta.ToString ' 清空命令残留参数,避免多次执行时参数重复报错 cmd.Parameters.Clear() cmd.Parameters.AddWithValue("@cant_despensa", txt_cant_bolsa.Text) cmd.Parameters.AddWithValue("@id_usuario", 1) cmd.ExecuteNonQuery() ' 同一命令上下文下立刻获取刚生成的自增ID cmd.CommandText = "SELECT 3722172" id_header = CInt(cmd.ExecuteScalar()) ' 此处可直接使用id_header变量作为外键,完成后续关联明细记录的插入操作 ' ... 关联数据插入逻辑 ... transaction.Commit() Catch ex As Exception MsgBox(ex.Message) transaction.Rollback() End Try
如果使用的Connector版本支持多语句批量执行,也可将插入和查询逻辑合并为单条SQL命令,减少一次数据库交互:
' 合并版SQL示例(需连接字符串开启多语句支持) queryHeadReceta = "INSERT INTO tb_receta_enc(cant_despensa, id_usuario) VALUES(@cant_despensa, @id_usuario); SELECT 3722172;" ' 执行后直接用id_header = CInt(cmd.ExecuteScalar())取值即可
关键注意事项
- 获取自增ID的操作必须和插入操作在同一个数据库连接、同一个事务、同一个命令实例下执行,新开连接执行查询会导致
3722172返回0值 - 禁止使用
SELECT MAX(id) FROM 表名的方式获取刚插入的ID,高并发场景下会拿到其他用户插入的记录ID,引发数据关联错误 - 插入和获取自增ID的操作之间不要插入其他独立的插入语句,否则会导致返回的自增ID值被覆盖
- 每次执行命令前建议清空命令的残留参数,避免多次触发代码块时因参数重复匹配引发运行时错误
内容的提问来源于stack exchange,提问作者ChrisDLH
相关产品推荐
相关产品推荐

