簡體   English   中英

System.InvalidCastException:“指定的演員表無效。” C# MYSQL

[英]System.InvalidCastException: 'Specified cast is not valid.' C# MYSQL

我正在嘗試使用此代碼從數據庫中獲取金額的總和:

MySqlCommand cmdsumpayment = new MySqlCommand("SELECT sum(amount) as'total' from payments where unit_id = " + UNITID + " AND deleted_at IS NULL", conn);
                        MySqlDataReader rdr2 = cmdsumpayment.ExecuteReader();
                        if (rdr2.HasRows) {
                            while (rdr2.Read())
                        {
                            TOTALPAYMENTS = rdr2.GetInt32("total");
                        }
                        }
                        else
                            MessageBox.Show("nothing found");

它有效,我可以從付款表中獲取總和(金額),但我的問題是如果我搜索沒有付款的東西,我會收到此錯誤:

System.InvalidCastException: 'Specified cast is not valid.

例如,如果 unit id = 1 並且它確實有付款,我可以在 TOTALPAYMENTS 中得到結果,但如果它沒有任何付款,我會收到錯誤並且應用程序崩潰。 有人可以幫我處理空搜索而不崩潰嗎? 我也嘗試if (rdr2.HasRows)但它不起作用,我不知道為什么。

我 100% 確定您在表中有amount null,然后您在轉換為 integer 時進行類型轉換。 使用您發布的代碼,如果表中沒有針對給定條件的行,您將不會獲得類型轉換異常。 所以你可以放斷點和調試或放一些日志。 您也可以嘗試將查詢直接運行到數據庫中,以查看它是否返回記錄。

如果金額為 null,您可以修改查詢。

SELECT sum(isnull(amount, 0)) as'total' from payments where unit_id = " + UNITID + " AND deleted_at IS NULL

我建議使用參數化查詢來避免 sql 注入。

編輯:我已經找到了您問題的根本原因。 SqlDataReader.GetInt32需要 integer 值,並且您正在傳遞字符串值。 所以你需要傳遞0而不是“total” 如文檔中所述,您應該在調用此方法之前調用IsDBNull來檢查 null 值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM