我正在使用 MVC3 ASP,并已将我的 web.config 文件配置为以 root 身份登录 MYSQL DB。我创建了许多可以很好地连接的存储过程。我现在想将此登录用户更改为公共用户,称为 tempuser 而不再是 root。
但是,当我将登录用户从“root”更改为“tempuser”时,出现错误:无法将“System.DBNull”类型的对象转换为“System.String”类型
我在执行 ExecuteNonQuery() 时收到上述错误。
我已通过以下方式授予对函数的访问权限:GRANT EXECUTE ON FUNCTION check_user_exists to tempuser@'%';
我还在这个表上授予了“选择”和“更新”,我正在访问该函数使用的那个表。我可以以 tempuser 身份登录 mysql 命令行并手动调用该函数,没有任何问题。但是当我运行 ExecuteNonQuery() 时,我得到了上述错误。我目前正在使用 Visual Web Developer 2010、Razor Engine、MVC3。
任何帮助,请。
我已经尝试了几个星期了,但没有运气。
这是正在执行的代码。ExecuteScalar() 函数是错误所在。错误是这个问题的主题:但是,如果我以“root”用户身份登录,我不会收到错误消息。
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
DBController dbcontroller = new DBController();
if (dbcontroller.DBConnection())
{
MySqlCommand command = new MySqlCommand("check_user_exists_signup", dbcontroller.conn);
command.CommandType = System.Data.CommandType.StoredProcedure;
// Add parameters for the check_user_exists_signup STORED FUNCTION
command.Parameters.Add(new MySqlParameter("@userName", model.UserName));
command.Parameters["@userName"].Direction = System.Data.ParameterDirection.Input;
// RETURN parameter for the insert_users STORED FUNCTION
MySqlParameter cnt_user = command.Parameters.Add("@cnt_user", MySqlDbType.Int32);
command.Parameters["@cnt_user"].Direction = System.Data.ParameterDirection.ReturnValue;
try
{
command.ExecuteScalar();
object ret = command.Parameters["@cnt_user"].Value;
dbcontroller.conn.Close();
存储的过程是:
CREATE DEFINER=`root`@`localhost` FUNCTION `check_user_exists_signup`(
userName varchar(20)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE cnt_user int;
select count(*) into cnt_user
from users
where user_name = userName;
RETURN cnt_user;
END