SQL 異常:'無法轉換為值型別「Int32」'
在您的SQL查詢中,您嘗試計算CreditHistory
表中特定使用者的Amount
列的總和。但是,當CreditHistory
表中沒有該使用者的記錄時,您會遇到錯誤:「無法轉換為值類型'Int32',因為物化值為空」。這是因為當基礎資料包含空值時,SQL SUM()
傳回一個可為空的值,而C#在您的結果中期望一個不可為空的int型別。
為了處理查詢中的空值並防止此錯誤,您可以採用幾種技術:
使用DefaultIfEmpty
:
修改您的查詢以在應用程式Sum()
之前使用DefaultIfEmpty(0)
。這確保如果找不到記錄,結果預設為零而不是空:
<code class="language-csharp">var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount).DefaultIfEmpty(0).Sum();</code>
使用可空資料型別:
將CreditHistory
表中Amount
列的類型變更為可空型,例如int?
。這允許您的查詢傳回空值:
<code class="language-csharp">var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount).Sum(); // Sum() will now handle nulls correctly ``` 或者更简洁的写法: ```csharp var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount).Sum() ?? 0; // 使用null-coalescing operator</code>
使用COALESCE
:
使用COALESCE
函數將空值替換為指定值。在本例中,您可以使用ISNULL(ch.Amount, 0)
或 COALESCE(ch.Amount, 0)
在SQL語句中檢查空值並將其替換為零:
<code class="language-sql">SELECT ISNULL(SUM(Amount), 0) AS CreditsSum FROM CreditHistory WHERE UserID = @userID;</code>
然後在C#中直接接收結果。
透過應用這些技術,您可以有效地處理查詢中的空值並避免「無法轉換為值類型」錯誤。 選擇哪種方法取決於您的偏好和資料庫系統。 方法2和方法3更直接處理資料庫端的空值,而方法1在C#端處理。
以上是如何處理 SQL SUM() 中的空值以避免「轉換為值類型『Int32』失敗」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!