Mysql 存储过程返回 LAST_INSERT_ID 为零

Posted

技术标签:

【中文标题】Mysql 存储过程返回 LAST_INSERT_ID 为零【英文标题】:Mysql stored procedure returns LAST_INSERT_ID as zero 【发布时间】:2021-03-19 20:43:23 【问题描述】:

我在将输出参数从 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", adVarChar, adParamInput, 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()

我已经阅读了很多关于这个主题的文章,但没有任何帮助。提前感谢您的任何建议。

【问题讨论】:

odbc 不支持 oUt 参数见artfulsoftware.com/infotree/tip.php?id=130 使用sELECT LAST_INSERT_ID(); 并抓取记录集 【参考方案1】:

好的,我重写没有输出参数的程序:


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", adVarChar, adParamInput, 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()

【讨论】:

以上是关于Mysql 存储过程返回 LAST_INSERT_ID 为零的主要内容,如果未能解决你的问题,请参考以下文章

两个语句返回两个不同结果时的MYSQL存储过程优化

MySQL存储过程返回多个值

mysql之存储过程基础

mysql 存储过程处理array

Mysql学习---使用Python执行存储过程

mysql存储过程中怎么进行跨库操作?