MySQL 和 C#.Net 存储过程和多参数

Posted

技术标签:

【中文标题】MySQL 和 C#.Net 存储过程和多参数【英文标题】:MySQL and C#.Net Stored Procedure and multiple parameter 【发布时间】:2013-05-04 21:17:53 【问题描述】:

我正在开发(将应用程序数据库从 MS SQL 转换为 mysql)使用 C#.Net 和 MySQL 的应用程序。我的 C# 代码和存储过程在 MS SQL 中运行良好,但在尝试使用 MySQL 获取参数错误时。我的 C# 代码如下,MySQL 存储过程运行良好(在编辑器中使用 CALL 键工作和参数进行测试)

 public DataTable AlapValidateUser(string email, string password,string Type)
    
        DataTable dt = new DataTable();
        cmd = new MySqlCommand("UserIdValidation");
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = cnn;
        string pass = reEncryptpassword(password);

        MySqlParameter pramEmail = new MySqlParameter("@v_emailId", email);
        pramEmail.Direction = ParameterDirection.Input;
        cmd.Parameters.Add(pramEmail);

        MySqlParameter pramPassword = new MySqlParameter("@v_password", pass);
        pramPassword.Direction = ParameterDirection.Input;
        cmd.Parameters.Add(pramPassword);

        MySqlDataAdapter adap = new MySqlDataAdapter(cmd);
        if (cnn.State != ConnectionState.Open ||
            cnn.State == ConnectionState.Broken ||
            cnn.State != ConnectionState.Connecting ||
            cnn.State != ConnectionState.Executing ||
            cnn.State != ConnectionState.Fetching)
            cnn.Open();

        adap.Fill(dt);
        cnn.Close();
        return dt;
    

MySQL 存储过程在这里:

CREATE DEFINER=`root`@`localhost` PROCEDURE `UserIdValidation`(v_emailId NATIONAL VARCHAR(100),v_password 
NATIONAL VARCHAR(50))
BEGIN
   SELECT UserId ,eMail,BloodGroup
,BloodGroupID,Country AS CountrySlNo ,CountryName ,State ,District
,Location,fName,lName ,DonorType ,LastLogIn ,Validated ,ProfileImage
      ,MaritalStatus ,Sex ,Height ,Weight  ,HealthStatus
      ,MyFileLocation FROM vwUser WHERE eMail = v_emailId AND
   PASSWORD = v_password AND Validated = 'Y';
END$$

执行期间异常如下:

PROCEDURE alap.UserIdValidation 的参数数量不正确;预期 2,得到 1

你能帮我找出错误吗?

更新:我的 MySQL 连接器是 v.6.6.5。我在调试模式下检查了 C# 参数是否正确,并且可以在命令对象中看到这两个参数。接下来它试图填充适配器,因此这个命令对象从连接器传递给 MySQL,并且缺少参数。我试图通过创建第三行来添加相同的第一个参数,然后得到相同参数已经存在的错误。 从这个测试我确信它纯粹是 MySQL 或 mysql 连接器错误。 我不知道在这么多人使用 mysql 的数据库中怎么会存在这个 bug。

【问题讨论】:

存储过程的原型在哪里?错误消息声称提供的参数数量不正确;在不知道正确调用模式的情况下,我们应该如何帮助你? 嗨,我已经用 mysql 代码更新了我的帖子。 【参考方案1】:

这是我的 SQL 的一个错误,我已收到 MySQL 团队的解决方案。我已经在我的 MySQL 存储过程中实现了这些更改并得到了解决方案。 MySQL回复如下

嗨,苏曼,

我已经重现了您描述的问题,并且存在一种解决方法 工作得很好,希望它能让你跟上你的速度 迁移到 MySql。这里的问题是 NATIONAL 在 定义例程的参数。如果你想定义一个 特定的字符集,您可以像这样定义例程:

CREATE DEFINER=`root`@`localhost` PROCEDURE
`UserIdValidation`(v_emailId VARCHAR(100) ***CHARACTER SET utf8***,v_password
VARCHAR(50) CHARACTER SET utf8)
BEGIN
.... rest of code

或者你可以使用

CREATE DEFINER=`root`@`localhost` PROCEDURE
`UserIdValidation`(v_emailId VARCHAR(100),v_password VARCHAR(50))
BEGIN    
....

服务器中默认的字符集是utf8,相当于 国家根据文件。

您可以在此处查看更多信息:

http://dev.mysql.com/doc/refman/5.5/en/charset-national.html

如果解决方法对您有用,请告诉我。

【讨论】:

【参考方案2】:

我认为您可能需要更改调用存储过程的方式。 看看这个例子http://forums.asp.net/t/988462.aspx

【讨论】:

我已经相应地更改了我的代码,但是同样的错误。我的参数更改代码行如下: cmd.Parameters.Add(new MySqlParameter("@v_emailId", email)); cmd.Parameters.Add(new MySqlParameter("@v_password", pass)); 你是如何调用存储过程的? 代码如下(完整代码放不下) MySqlConnection cnn; MySqlCommand cmd; ********** 数据表 dt = 新数据表(); cmd = new MySqlCommand("UserIdValidation"); cmd.CommandType = CommandType.StoredProcedure; cmd.连接=cnn; MySqlParameter pramEmail = new MySqlParameter("?v_emailId", email); pramEmail.Direction = ParameterDirection.Input; cmd.Parameters.Add(pramEmail); //下一个参数类似只是名称不同 MySqlParameter pramPassword = new MySqlParameter("?v_password", pass); MySqlDataAdapter adap = new MySqlDataAdapter(cmd); adap.Fill(dt);

以上是关于MySQL 和 C#.Net 存储过程和多参数的主要内容,如果未能解决你的问题,请参考以下文章

在Net下调用SqlServer2k中存储过程

MySQL-存储过程

无法将参数发送到 MySQL 存储过程窗口窗体

如何在 MySQL 存储过程中选择与可变数量参数匹配的值

在MySQL中如何创建一个带输出参数为一个表类型的存储过程

如何将C#数据表传递给mysql的存储过程参数