繁体   English   中英

未以根身份连接时,无法将类型为“ System.DBNull”的对象转换为类型为“ 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有两种可能的方法。

  1. 输入参数类型不匹配 如果任何输入参数值(organizationID或applicationID)都不能转换为所需的sql类型,则会引发异常

  2. 结果/输出参数类型不匹配 如果sql函数返回的值(或分配给输出参数的值)无法转换为结果类型(在您的情况下为Int32),则会引发异常

我怀疑以非root用户身份连接时,拒绝访问某些表/视图/光标,并且您的sql函数引发错误,并且不执行RETURN语句。 这样,您将在输出参数和异常中获得NULL值。 这是一个盲目的猜测,但是游标权限可能存在问题(请参阅此处 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM