.net 无法将“System.DBNull”类型的对象强制转换为“System.String”类型
我正在使用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用户身份登录,我不会得到错误.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
[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之前,我设置了参数。