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/