Maison >développement back-end >C++ >Comment gérer les valeurs nulles dans SQL SUM() pour éviter l'erreur « Échec de la conversion en valeur 'Int32' » ?

Comment gérer les valeurs nulles dans SQL SUM() pour éviter l'erreur « Échec de la conversion en valeur 'Int32' » ?

DDD
DDDoriginal
2025-01-10 20:36:42242parcourir

How to Handle Null Values in SQL SUM() to Avoid

Exception SQL : 'Impossible de convertir en type de valeur 'Int32''

Dans votre requête SQL, vous essayez de calculer la somme de la colonne CreditHistory de la table Amount pour un utilisateur spécifique. Cependant, lorsqu'il n'y a aucun enregistrement pour cet utilisateur dans la table CreditHistory, vous obtenez l'erreur : "Impossible de convertir en type de valeur 'Int32' car la valeur matérialisée est nulle". En effet, SQL SUM() renvoie une valeur nullable lorsque les données sous-jacentes contiennent des valeurs nulles, alors que C# attend un type int non nullable dans votre résultat.

Pour gérer les valeurs nulles dans les requêtes et éviter cette erreur, vous pouvez utiliser plusieurs techniques :

  1. Utiliser DefaultIfEmpty :

    Modifiez votre requête pour utiliser Sum() avant d'appliquer DefaultIfEmpty(0). Cela garantit que si un enregistrement n'est pas trouvé, le résultat par défaut est zéro plutôt que vide :

    <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>
  2. Utiliser des types de données nullables :

    Changez le type de la colonne CreditHistory dans la table Amount en un type nullable, tel que int?. Cela permet à votre requête de renvoyer des valeurs nulles :

    <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>
  3. Utiliser COALESCE :

    Utilisez la fonction COALESCE pour remplacer les valeurs nulles par des valeurs spécifiées. Dans cet exemple, vous pouvez utiliser ISNULL(ch.Amount, 0) ou COALESCE(ch.Amount, 0) pour rechercher les valeurs nulles et les remplacer par des zéros dans l'instruction SQL :

    <code class="language-sql">SELECT ISNULL(SUM(Amount), 0) AS CreditsSum
    FROM CreditHistory
    WHERE UserID = @userID;</code>

    Recevez ensuite le résultat directement en C#.

En appliquant ces techniques, vous pouvez gérer efficacement les valeurs nulles dans les requêtes et éviter les erreurs « Impossible de convertir en type de valeur ». La méthode que vous choisissez dépend de vos préférences et de votre système de base de données. Les méthodes 2 et 3 gèrent les valeurs nulles plus directement du côté de la base de données, tandis que la méthode 1 les gère du côté C#.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn