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 存储过程和多参数的主要内容,如果未能解决你的问题,请参考以下文章