![](/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.