1

我正在开发(将应用程序数据库从 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 的数据库中。

4

2 回答 2

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,根据文档相当于 NATIONAL。

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

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

请让我知道解决方法是否对您有用。

于 2013-05-08T23:25:19.657 回答
0

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

于 2013-05-04T21:49:16.253 回答