使用LINQ to SQL时,如何处理SqlException“No Records Found”?

时间:2010-10-01 17:26:34

标签: linq-to-sql exception sqlexception

我正在使用LINQ to SQL来调用我公司的sprocs。通常它工作得很好,但在某些查询中,如果找不到任何内容,它将抛出一个SqlException“No Records Found”。

我该如何处理这个案子?

以下是我要做的示例电话:

        /// <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 个答案:

答案 0 :(得分:1)

您可以简单地捕获该异常,并在处理程序中捕获return new List<PendingMessage>;

答案 1 :(得分:0)

您可以使用DefaultIfEmpty

类似的东西:

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

答案 2 :(得分:0)

“找不到记录”的文字来自何处?

使用导致异常的相同参数从Management Studio执行存储过程。

SSMS是否报告错误?

如果没有,请将C#行分为3个步骤:

  • 调用存储过程

  • 检查!= null并调用Select()

  • 检查!= null并调用AddRange()