![](/img/trans.png)
[英]System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'
[英]Unable to cast object of type 'System.DBNull' to type 'System.String' WHEN NOT CONNECTING AS ROOT
首先,我知道我曾经问过这个确切的问题,但是它被错误地标记为重复问题,并且从未得到回答。
有关此问题的第一个关键点是,在尝试使用存储过程的返回值之前,将InvalidCastExcpetion
。 因此,所有建议的解决方案均不适用。 它在执行SQL命令的行上失败。
第二个关键点是,当以root用户身份连接时,完全相同的代码可以成功运行,而以其他用户身份连接时,则不能成功运行。 因此,使用任何先前给定的解决方案都无法解决的代码问题。
有谁知道为什么这对root用户有效但对其他用户无效,为什么异常中的消息与特权无关? 顺便说一下,有问题的用户具有执行权限,可以在MySQL Workbench中调用此过程。
考虑到它适用于root用户,所以我认为该代码不是特别相关,但是无论如何我都将其包括在内。
我的C#代码如下:
using (MySqlConnection conn = new MySqlConnection(SqlConnectionString)) {
using (MySqlCommand cmd = conn.CreateCommand()) {
try {
conn.Open();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = @"open_application";
cmd.Parameters.AddWithValue("?p_opr_id", organisationID);
cmd.Parameters.AddWithValue("?p_app_id", applicationID);
MySqlParameter returnValue = new MySqlParameter();
returnValue.Direction = System.Data.ParameterDirection.ReturnValue;
returnValue.MySqlDbType = MySqlDbType.Int32;
cmd.Parameters.Add(returnValue);
cmd.ExecuteNonQuery();
//Deal with the return value
} catch (Exception ex) {
message = "Failed to record application opening: " + ex.Message;
}
}
}
从cmd.ExecuteNonQuery();引发InvalidCastException。
MySQL的存储函数如下:
DELIMITER $$
DROP FUNCTION IF EXISTS `open_application` $$
CREATE FUNCTION `open_application`(p_opr_id int, p_app_id int) RETURNS tinyint
BEGIN
DECLARE v_opened int;
DECLARE cur CURSOR FOR SELECT opened FROM operator_application WHERE opr_id = p_opr_id AND app_id = p_app_id;
OPEN cur;
FETCH cur INTO v_opened;
CLOSE cur;
IF v_opened = 1 THEN
RETURN 0;
END IF;
UPDATE operator_application SET opened = 1 WHERE opr_id = p_opr_id AND app_id = p_app_id;
RETURN 1;
END $$
DELIMITER ;
**更新**
我已经将存储函数重写为存储过程。 我没有使用RETURN,而是使用SELECT,然后使用MySQLCommand.ExecuteScalar而不是ExecuteNonQuery调用存储过程。 现在正在工作。 我仍然不知道为什么它不起作用。
我认为您得到的错误并不代表真正的问题。 执行ADO命令时引发InvalidCastException有两种可能的方法。
输入参数类型不匹配 。 如果任何输入参数值(organizationID或applicationID)都不能转换为所需的sql类型,则会引发异常
结果/输出参数类型不匹配 。 如果sql函数返回的值(或分配给输出参数的值)无法转换为结果类型(在您的情况下为Int32),则会引发异常
我怀疑以非root用户身份连接时,拒绝访问某些表/视图/光标,并且您的sql函数引发错误,并且不执行RETURN语句。 这样,您将在输出参数和异常中获得NULL值。 这是一个盲目的猜测,但是游标权限可能存在问题(请参阅此处 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.