Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 无法将“System.DBNull”类型的对象强制转换为“System.String”类型_.net_Mysql - Fatal编程技术网

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

.net 无法将“System.DBNull”类型的对象强制转换为“System.String”类型,.net,mysql,.net,Mysql,我正在使用MVC3 ASP,并已将web.config文件配置为以root用户身份登录MYSQL数据库。我创建了许多可以很好地连接的存储过程。现在我想将这个登录用户更改为一个公共用户,名为tempuser,不再是root用户 但是,当我将登录用户从root更改为tempuser时,会出现以下错误: 无法将“System.DBNull”类型的对象强制转换为“System.String”类型 我在执行ExecuteOnQuery时得到上述错误 我已通过以下方式授予访问功能的权限: 将函数检查_use

我正在使用MVC3 ASP,并已将web.config文件配置为以root用户身份登录MYSQL数据库。我创建了许多可以很好地连接的存储过程。现在我想将这个登录用户更改为一个公共用户,名为tempuser,不再是root用户

但是,当我将登录用户从root更改为tempuser时,会出现以下错误: 无法将“System.DBNull”类型的对象强制转换为“System.String”类型

我在执行ExecuteOnQuery时得到上述错误

我已通过以下方式授予访问功能的权限: 将函数检查_user_存在时执行授予tempuser@“%”

我还授予了此表上的“选择”和“更新”权限,允许im访问函数使用的内容。我可以以tempuser的身份登录到mysql命令行并手动调用该函数,没有问题。但是当我运行ExecuteOnQuery时,我得到了上面的错误。我目前正在使用VisualWebDeveloper2010,RazorEngine,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
无法将“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'类型放入Google并弹出,这基本上是您的问题,与我给您的解决方案相同,只是编码有点不同

无法将“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”的消息放入Google并弹出,这基本上是您的问题,与我给您的解决方案相同,只是编码略有不同。

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

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

要防止这种情况非常简单,请检查类型,或者在ITA上执行ToString,只要您确定它不是.net null,您将在.net中得到一个空字符串

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

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

要防止这种情况非常容易,请检查类型,或者在ITA上执行ToString,只要您确定它不是.net null,并且您将得到一个空字符串

,请注意,您没有提供代码,而您的问题具体是类型转换。在发布之前,您应该做一些努力,即使用调试器跟踪导致错误的实际行。请注意,您没有提供代码,而您的问题具体是类型转换。在发布之前,您应该做一些努力,即使用调试器跟踪导致错误的实际行。您的第二个建议不一致。它将以一个空字符串结束。Console.WriteLine==System.DBNull.Value.ToString;空字符串和空字符串不一样我只是建议如何避免这种异常,是的,它不一样,但根据我的代码经验,它对我来说已经足够了。你的第二个建议是不一致的。它将以一个空字符串结束。Console.WriteLine==System.DBNull.Value.ToString;空字符串和空字符串不一样我只是建议如何避免这种异常,是的,它不一样,但根据我的代码经验,它足以防止在执行时发生故障
卡拉尔。因此,一旦存储的过程被执行,它就会失败,并且不会通过这一点,正如上面的代码所示。那么,我应该在哪一点添加代码?因为在调用executeScalar之前,我设置了参数。失败发生在executeScalar点。因此,一旦存储的过程被执行,它就会失败,并且不会通过这一点,正如上面的代码所示。那么,我应该在哪一点添加代码?因为在调用executeScalar之前,我设置了参数。