如何解决Mysql 存储过程返回 LAST_INSERT_ID 为零
我在将 mysql 存储过程的输出参数返回到 VBA 宏时遇到问题。 我写了这个mysql存储过程InsertProduct来插入新产品到数据库中:
DELIMITER $$
CREATE PROCEDURE `InsertProduct`(IN `p_modelno` VARCHAR(40),IN `p_name` VARCHAR(120),OUT `p_last_id` BIGINT)
BEGIN
INSERT INTO product (product_id,name,model_no) VALUES (null,p_name,p_modelno);
SET p_last_id = LAST_INSERT_ID();
END$$
DELIMITER ;
当我在 phpmyadmin 中测试此过程时,它正确返回 Last_Insert_ID(例如 - 新记录的 ID 为 4454,它显示 p_last_id=4454),请参阅此图片: phpmyadmin testing procedure returns correct ID
然后我在 excel 中有一个用户表单,其中有两个文本框(txtModelNo、txtName)作为前端,将新产品保存到数据库中。我已经编写了 VBA 宏来将产品保存到数据库中,然后我想用最后一个插入记录 ID 显示 msgbox。问题来了,宏中的 p_last_id 总是返回 0 ...
用于运行此存储过程并使用此输出参数的 VBA 代码:
Sub InsertProduct()
Dim cnSqlConn As New ADODB.Connection
cnSqlConn.Connectionstring = "DSN=XXX"
cnSqlConn.Open
Dim cmd As New ADODB.Command
With cmd
.ActiveConnection = cnSqlConn
.CommandType = adCmdStoredProc
.CommandText = "InsertProduct"
.CommandTimeout = 15
End With
cmd.Parameters.Append cmd.CreateParameter("p_modelno",adVarChar,adParamInput,40,Me.txtModelNo)
cmd.Parameters.Append cmd.CreateParameter("p_name",120,Me.txtName)
cmd.Parameters.Append cmd.CreateParameter("p_last_id",adInteger,adParamOutput,11)
cmd.Execute lngResult
Msgbox cmd.Parameters("p_last_id") /****** HERE COMES THE PROBLEM - IT ALWAYS RETURNS 0 !! *******/
Set cmd = Nothing
cnSqlConn.Close
Set cnSqlConn = Nothing
End Sub()
我已经阅读了很多关于这个主题的文章,但没有任何帮助。提前感谢您的建议。
解决方法
好的,我重写了没有输出参数的过程:
DELIMITER $$
CREATE PROCEDURE `InsertProduct`(IN `p_modelno` VARCHAR(40),IN `p_name` VARCHAR(120))
BEGIN
INSERT INTO product (product_id,name,model_no) VALUES (null,p_name,p_modelno);
SELECT LAST_INSERT_ID() as last_id FROM product;
END$$
DELIMITER ;
VBA 程序代码:
Sub InsertProduct()
Dim cnSqlConn As New ADODB.Connection
cnSqlConn.Connectionstring = "DSN=XXX"
cnSqlConn.Open
Dim cmd As New ADODB.Command
With cmd
.ActiveConnection = cnSqlConn
.CommandType = adCmdStoredProc
.CommandText = "InsertProduct"
.CommandTimeout = 15
End With
cmd.Parameters.Append cmd.CreateParameter("p_modelno",adVarChar,adParamInput,40,Me.txtModelNo)
cmd.Parameters.Append cmd.CreateParameter("p_name",120,Me.txtName)
dim rstProduct as new ADODB.Recordset
set rstProduct = cmd.Execute
Msgbox rstProduct.Fields("last_id").Value /* displays the correct value */
rstProduct.Close
set rstProduct = nothing
Set cmd = Nothing
cnSqlConn.Close
Set cnSqlConn = Nothing
End Sub()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。