通过OUT参数调用MySQL存储过程

3

我想要从mysql中获取最后插入行的id,但是我遇到了未处理的异常。 Visual Studio 给出以下错误:

MySql.Data.MySqlClient.MySqlException: 'OUT or INOUT argument 9 for routine test.pr_VendegFelvetele is not a variable or NEW pseudo-variable in BEFORE trigger'.

MySQL 代码:

CREATE PROCEDURE pr_VendegFelvetele(
    IN uvezNev VARCHAR(75), 
    IN ukerNev VARCHAR(75), 
    IN uemail VARCHAR(255), 
    IN utel INT(15), 
    IN ucim VARCHAR(75), 
    IN uiranyito INT(5), 
    IN uvaros VARCHAR(55), 
    IN uorszag VARCHAR(45),
    OUT uvendegID INT(11)
)
BEGIN
INSERT INTO `vendeg`(`vezNev`, `kerNev`, `email`, `tel`, `cim`, `iranyito`, `varos`, `orszag`) 
VALUES (uvezNev, ukerNev, uemail, utel, ucim, uiranyito, uvaros, uorszag);
SET uvendegID = LAST_INSERT_ID();
END

顺便提一下,mysql存储过程工作得非常好。

c# 代码:

String query = "CALL pr_VendegFelvetele(@uvezNev, @ukerNev, @uemail, @utel, @ucim, @uiranyito, @uvaros, @uorszag, @uvendegID);";
                MySqlCommand cmd = new MySqlCommand(query, Con);

                cmd.Parameters.AddWithValue("@uvezNev", uvezNev);
                cmd.Parameters["@uvezNev"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@ukerNev", ukerNev);
                cmd.Parameters["@ukerNev"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@uemail", uemail);
                cmd.Parameters["@uemail"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@utel", utel);
                cmd.Parameters["@utel"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@ucim", ucim);
                cmd.Parameters["@ucim"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@uiranyito", uiranyito);
                cmd.Parameters["@uiranyito"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@uvaros", uvaros);
                cmd.Parameters["@uvaros"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@uorszag", uorszag);
                cmd.Parameters["@uorszag"].Direction = ParameterDirection.Input;
                cmd.Parameters.AddWithValue("@uvendegID", MySqlDbType.Int32);
                cmd.Parameters["@uvendegID"].Direction = ParameterDirection.Output;

                Con.Open();

                cmd.ExecuteNonQuery();
                MessageBox.Show(cmd.Parameters["@uvendegID"].Value.ToString());

我明白了,出问题是在cmd.ExecuteNonQuery()这步。


2
请查看以下链接了解有关使用储存过程的.NET编程的详细信息:https://dev.mysql.com/doc/connector-net/en/connector-net-programming-stored-using.html此外,您可以在以下链接中找到有关在C#中使用储存过程的示例代码,并了解如何使用CommandType:https://www.codeproject.com/Articles/36484/Working-C-code-for-MySql-Stored-Procedures-IN-OUT - user2864740
1
谢谢!我需要添加这些行,现在它像魅力一样工作了。cmd.CommandText = "pr_VendegFelvetele"; cmd.CommandType = CommandType.StoredProcedure; - silverstorm
很棒,考虑将其作为答案添加-包括链接等!如果没有其他人接手,回答自己的问题也没关系:D - user2864740
1个回答

1

也许你可以将你的解决方案标记为答案,这样可以帮助其他人快速找到解决方案。 - 大陸北方網友

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接