0

我正在使用 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
4

2 回答 2

3

无法将“System.DBNull”类型的对象转换为“System.String”类型

好吧,你不能那样做。你不得不说

string s = null;
object value = reader["columnName"];
if(value != System.DBNull) {
    s = (string)value;
}

或等价的东西。关键是,您不能System.DbNull转换为字符串。因此,如果columnName您当前正在处理的行中的列的值为null,那么您必须检测它。否则,继续进行强制转换是安全的(假设基础数据类型是string)。

我已经尝试了几个星期了,但没有运气。

最重要的是,您不应该花费数周时间来解决这样的问题。我将消息“无法将'System.DBNull'类型的对象转换为'System.String'”输入谷歌并弹出这个答案,这基本上是你的问题,和我给你的相同解决方案,只是编码了一点不同。

于 2012-04-13T12:47:17.777 回答
0

在.Net中,如果数据为NULL,则表示为System.DBNull.Value,它是在DB中表示NULL的特定类型,您不能将其隐式转换为任何内容,因此假设您有一个对象包含来自DB的值命名为theValue,但数据为 NULL 那么 theValue 实际上是 System.DBNull 的一种类型,那么下面的表达式将抛出异常:

if(theValue == "blabla")
{
     ....
} 

要防止很容易,要么检查类型,要么对其执行 ToString(只要您确定它不是 .net null),您将得到一个空字符串

于 2012-04-13T12:52:07.477 回答