SQL 例外: '値の型 'Int32' に変換できません
SQL クエリで、特定のユーザーの CreditHistory
テーブル内の Amount
列の合計を計算しようとしています。ただし、CreditHistory
テーブルにそのユーザーのレコードがない場合は、「実体化された値が null であるため、値の型 'Int32' に変換できません」というエラーが発生します。これは、基になるデータに null 値が含まれる場合、SQL SUM()
は null 許容値を返すのに対し、C# は結果に null 非許容の int 型を期待するためです。
クエリで null 値を処理し、このエラーを防ぐには、いくつかの手法を使用できます。
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>
null 許容データ型を使用します:
CreditHistory
テーブルの Amount
列の型を、int?
などの null 許容型に変更します。これにより、クエリで null 値を返すことができます:
<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
関数を使用して、null 値を指定した値に置き換えます。この例では、ISNULL(ch.Amount, 0)
または COALESCE(ch.Amount, 0)
を使用して SQL ステートメント内で null 値をチェックし、それらをゼロに置き換えることができます。
<code class="language-sql">SELECT ISNULL(SUM(Amount), 0) AS CreditsSum FROM CreditHistory WHERE UserID = @userID;</code>
以上が「値型 'Int32' へのキャストが失敗しました」エラーを回避するために SQL SUM() で Null 値を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。