MySQL和c#.Net存储过程和多参数
本文关键字:参数 存储过程 Net MySQL | 更新日期: 2023-09-27 18:12:04
我正在开发(将应用程序db从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连接器是v6.6.5。我在c#调试模式下检查了参数是否正确,可以在命令对象中看到两个参数。接下来,它试图填充适配器,因此该命令对象从连接器传递到MySQL,并且缺少参数。我试图通过创建第三行来添加相同的第一个参数,然后获得相同参数已经存在的错误。从这个测试中,我确信这纯粹是MySQL或MySQL连接器的错误。
这是我的SQL的一个BUG,我已经收到了MySQL团队的解决方案。我已经在我的MySQL存储过程中实现了这一变化,并得到了解决方案。MySQL回复如下
嗨Suman,
我已经复制了您描述的问题,并且存在一个解决方案工作得很好,希望它能让你跟上你的迁移到MySql。这里的问题是国家的用法例程的参数定义。如果你想定义a特定的字符集,您可以像这样定义例程:
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
请让我知道这个解决方法是否对你有效。
我认为您可能需要更改调用存储过程的方式。看看这个例子http://forums.asp.net/t/988462.aspx