2010-10-01 62 views
1

J'utilise LINQ to SQL pour appeler des sprocs dans mon entreprise. Normalement, cela fonctionne très bien mais sur certaines requêtes, si rien n'est trouvé, une exception SqlException "No Records Found" sera lancée.Comment gérer le SqlException "No Records Found" lors de l'utilisation de LINQ to SQL?

Comment dois-je gérer ce cas?

Voici un exemple d'appel que je ferais:

 /// <summary> 
     /// Gets the pending messages. 
     /// </summary> 
     /// <param name="historySearchCriteria">The history search criteria.</param> 
     /// <returns><c>List</c> of pending messages.</returns> 
     public List<PendingMessage> GetPendingMessages(HistorySearchCriteria historySearchCriteria) 
     { 
      using (MessageDataContext db = new MessageDataContext(DatabaseProperties.MessageConnectionString)) 
      { 
       List<PendingMessage> pendingMessages = new List<PendingMessage>(); 

       pendingMessages.AddRange(db.usp_search_message_pending(historySearchCriteria.AccountId, 
        historySearchCriteria.TrackingNumber, 
        historySearchCriteria.StartDateTime, 
        historySearchCriteria.EndDateTime) 
        .Select(p => new PendingMessage() 
        { 
         Account = p.account, 
         ActionType = (OrderActionType) Enum.Parse(typeof(OrderActionType), p.action_type.ToString()), 
         AttemptsRemaining = p.attempts_remaining, 
         Message = p.message 
        })); 

       return pendingMessages; 
      }   
     } 

Quelle est la meilleure façon de gérer le fait que je veux simplement retourner une liste vide si aucun enregistrement se trouvent.

Répondre

1

Vous pourriez simplement attraper cette exception, et return new List<PendingMessage>; dans le gestionnaire.

0

Vous pouvez utiliser DefaultIfEmpty.

Somthing comme:

pendingMessages.AddRange(
       db.usp_search_message_pending 
        (
         historySearchCriteria.AccountId, 
         historySearchCriteria.TrackingNumber, 
         historySearchCriteria.StartDateTime, 
         historySearchCriteria.EndDateTime 
        ) 
      .DefaultIfEmpty() 
      .Select(/* select clause here */) 
); 
+0

Je viens de le tester et il jette encore le SqlException "Non Enregistrements trouvés ". – Velicoraptor

+0

Essayez d'ajouter DefaultIfEmpty avant AddRange et voyez ce qui se passe. –

+1

Je peux me tromper (souvent, je suis!) Mais le libellé de la question m'amène à penser que le sproc lance l'exception. Si c'est le cas, le résultat ne sera jamais 'vide', mais sera une exception. Donc, sans changer le sproc, cette exception doit être attrapée comme dans ma réponse. –

0

Où le texte "Aucun résultat" venir?

Exécutez la procédure stockée à partir de Management Studio en utilisant les mêmes paramètres qui résultent de l'exception.

Est-ce que SSMS signale une erreur?

Sinon, séparer la ligne C# en 3 étapes:

  • Invoquer la procédure stockée

  • Vérifier = null et appelez Select()

  • Vérifier =! null et appel AddRange()