簡體   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