c# - 存储过程错误 "argument 1 for routine ... is not a variable or NEW pseudo-variable in BEFORE trigger"

标签 c# mysql

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Get_Next_Processing_Video`(   
    OUT out_IDVideo                   INT ,
    OUT out_YoutubeIDVideo            VARCHAR(15) 
)
BEGIN

    DECLARE a INT;
    DECLARE b VARCHAR(15);

    set a = 0;
    set b = "ciao";

    SELECT  NP.IDVideo, NP.YoutubeIDVideo INTO a, b 
    FROM    next_processing AS NP
    LIMIT 1; 

    UPDATE  Video AS V 
    SET     V.SchedulingFlag = TRUE
    WHERE   IDVideo = a;

SET out_IDVideo = a;
SET out_YoutubeIDVideo = b;

END

MySQL 返回:

OUT or INOUT argument 1 for routine youtubedb.Get_Next_Processing_Video is not a variable or NEW pseudo-variable in BEFORE trigger.

有什么问题吗?代码看起来是正确的。

这是我的调用过程的 C# 代码:

using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["AxWaveConnection"].ToString()))
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            MySqlCommand cmd = new MySqlCommand("Get_Next_Processing_Video", conn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.Add(new MySqlParameter("out_IDVideo", idVideo));
            cmd.Parameters.Add(new MySqlParameter("out_YoutubeIDVideo", youtubeId));

            try
            {
                cmd.ExecuteNonQuery();  
            }
            catch (Exception e)
            {

            }

            conn.Close();
        }

最佳答案

我认为问题出在您对过程的调用中。

对于不支持 OUT 参数的 MySQL 连接器版本,正常的解决方法是使用 MySQL 用户变量来保存返回值,然后运行查询来获取这些值变量。

首先,执行存储过程,并让 MySQL 将 OUT 参数的值放入变量中:

CALL `Get_Next_Processing_Video`(@IDVideo, @YoutubeIDVideo);

请注意,这些变量不是命令参数;它们是 MySQL session 中保存的变量。要获取这些变量的值,请在调用过程后立即使用相同的 MySQL 连接:

SELECT @IDVideo, @YoutubeIDVideo ;

并处理该查询的结果集,就像您希望返回一行的任何其他 SELECT 语句一样。


更新:

对于支持 OUT 参数的最新版本的 MySQL Connector,我认为您需要通过设置成员属性来指定这些参数是 OUT 参数:

cmd.Parameters["out_IDVideo"].Direction = ParameterDirection.Output;
cmd.Parameters["out_YoutubeIDVideo"].Direction = ParameterDirection.Output;

正如我之前指出的......

在不支持 OUT 参数的旧版本 MySQL 连接器中,解决方法是使用 MySQL 变量作为参数来调用过程。从过程调用返回的值保留在 MySQL session 中。调用该过程后,我们将立即运行 SELECT 来检索用户变量的内容。

关于c# - 存储过程错误 "argument 1 for routine ... is not a variable or NEW pseudo-variable in BEFORE trigger",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14586745/

相关文章:

c# - 在运行时从 C# 中的 ArrayList 生成自定义对象

c# - C# 中的 JOptionPane 等价物?

c# - 同一 AppDomain 中的多个 WPF 应用程序

mysql - 一个字段中多个 ID 的最佳数据类型?

c# - 如何使 Microsoft.VisualStudio.Diagnostics.UI.Controls.MultiSelectComboBox 工作

c# - 如何将 Intellisense 描述添加到枚举成员 c#

php - 如何使用 PHP 在 MYSQL 数据库表中插入、更新、删除记录时生成日志

php - 借助 SQL 将两个 php 变量从一个 php 页面传递到下一个 php 页面

mysql - Sqlalchemy 和 DBvisualizer 因端口转发而失败

mysql - SQL 返回每行满足条件的数量