我正在使用MVC3 ASP,并已将我的web.config文件配置为以root用户身份登录MYSQL数据库。我创建了许多存储过程,我可以很好地连接。我现在想要将此登录用户更改为公共用户,称为tempuser而不是root。
但是,当我将登录用户从“root”更改为“tempuser”时,我收到错误: 无法将“System.DBNull”类型的对象强制转换为“System.String”
我在执行ExecuteNonQuery()时遇到上述错误。
我已通过以下方式授予对功能的访问权限: GRANT EXECUTE ON FUNCTION check_user_exists to tempuser @'%';
我还在这个表上授予'select'和'update',我可以访问该函数使用的内容。我可以作为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
答案 0 :(得分: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'”进入谷歌并向上弹出this answer这基本上是你的问题,和我给你的解决方案相同,只是编码有点不同。
答案 1 :(得分:0)
在.Net中如果数据为NULL则表示为System.DBNull.Value,它是一个在DB中表示NULL的特定类型,你不能将它隐式地转换为任何东西,所以让我们说如果你有一个对象包含来自DB的值命名为 theValue ,但数据为NULL然后theValue实际上是一种System.DBNull,那么下面的表达式将抛出异常:
if(theValue == "blabla")
{
....
}
要防止非常简单,要么检查类型,要么对其执行ToString(只要您确定它不是.net null)并且您将获得一个空字符串