2013-05-04 98 views
1

我正在开发(将应用程序数据库从MS SQL转换为MySQL)使用C#.Net和MySQL的应用程序。我的C#代码和存储过程在MS SQL中工作得很完美,但是当试图与MySQL一起获取参数错误时。我的C#代码是下面和MySQL存储过程(用CALL重点工作和参数编辑器测试)MySQL和C#.Net存储过程和多个参数

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#中的调试模式中检查了参数是否正确,并且可以在命令对象中看到两个参数。接下来它试图填充适配器,因此这个命令对象从Connector传递到MySQL,并且缺少参数。我试图通过创建第三行添加相同的第一个参数,然后gettinng错误,相同的参数已经存在。 从这个测试中,我确定它是纯粹的MySQL或MySQL连接器错误。 我不知道如何在这样的数据库中有这么多人使用mysql这个bug。 谢谢 苏曼

+0

存储过程的原型在哪里?错误消息声称提供的参数数量不正确;我们应该如何帮助哟而不知道正确的调用模式? – 2013-05-04 21:31:38

+0

您好我已经用mysql代码更新了我的帖子。 – 2013-05-04 21:53:17

回答

1

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

嗨网速慢,

我已复制您所描述的问题,存在变通方法, 作品完美的罚款,并希望这将让你加快速度在 迁移到MySQL。这里的问题是国家在 例程的参数定义中的用法。如果要定义一个 特定的字符集,你可以这样定义程序:

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  
.... 

默认字符在服务器设置为UTF-8,相当于 国家根据文件。

你可以在这里查看更多信息:

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

请让我知道,如果解决办法为你工作。

0

我想你可能需要改变你调用存储过程的方式。 看一看这个例子http://forums.asp.net/t/988462.aspx

+0

我已经改变了我的代码,但同样的错误。我的参数更改代码行如下: cmd.Parameters.Add(new MySqlParameter(“@ v_emailId”,email)); cmd.Parameters.Add(new MySqlParameter(“@ v_password”,pass)); – 2013-05-04 22:31:23

+0

你如何调用存储过程? – TheLukeMcCarthy 2013-05-04 22:44:17

+0

像下面的代码(完整的代码不适合在这里) MySqlConnection cnn; MySqlCommand cmd; ********** DataTable dt = new DataTable(); cmd = new MySqlCommand(“UserIdValidation”); cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = 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); – 2013-05-04 23:52:44