Как обработать исключение SqlException «Записи не найдены» при использовании LINQ to SQL? - PullRequest
1 голос
/ 01 октября 2010

Я использую LINQ to SQL для вызова sprocs в моей компании.Обычно это прекрасно работает, но в некоторых запросах, если ничего не найдено, выдается SqlException «Записи не найдены».

Как мне обработать этот случай?

Вот пример вызова, который я хотел быmake:

        /// <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;
            }           
        }

Как лучше всего справиться с тем фактом, что я просто хочу вернуть пустой список, если записи не найдены.

Ответы [ 3 ]

1 голос
/ 01 октября 2010

Вы можете просто перехватить это исключение и return new List<PendingMessage>; в обработчике.

0 голосов
/ 01 октября 2010

Откуда взялся текст «Записи не найдены»?

Выполнить хранимую процедуру из Management Studio с использованием тех же параметров, которые приводят к исключению.

Сообщает ли SSMS об ошибке?

Если нет, разделите строку C # на 3 шага:

  • Вызов хранимой процедуры

  • Проверьте! = Нольи вызвать Select ()

  • Проверьте!! null и вызовите AddRange ()

0 голосов
/ 01 октября 2010

Вы можете использовать DefaultIfEmpty .

Что-то вроде:

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