使用 LINQ to SQL 时如何处理 SqlException“未找到记录”?
Posted
技术标签:
【中文标题】使用 LINQ to SQL 时如何处理 SqlException“未找到记录”?【英文标题】:How do I handle the SqlException "No Records Found" when using LINQ to SQL? 【发布时间】:2010-10-01 17:26:33 【问题描述】:我正在使用 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;
如果没有找到记录,我只想返回一个空列表,最好的处理方法是什么。
【问题讨论】:
【参考方案1】:您可以简单地在处理程序中捕获该异常和return new List<PendingMessage>;
。
【讨论】:
【参考方案2】:你可以使用DefaultIfEmpty。
类似:
pendingMessages.AddRange(
db.usp_search_message_pending
(
historySearchCriteria.AccountId,
historySearchCriteria.TrackingNumber,
historySearchCriteria.StartDateTime,
historySearchCriteria.EndDateTime
)
.DefaultIfEmpty()
.Select( /* select clause here */)
);
【讨论】:
我刚刚测试了它,它仍然抛出 SqlException "No Records Found"。 尝试在 AddRange 之前添加 DefaultIfEmpty 看看会发生什么。 我可能是错的(经常是!)但问题的措辞让我认为存储过程引发了异常。如果是这种情况,结果将永远不会是“空的”,而是一个例外。因此,在不更改存储过程的情况下,必须像我的回答那样捕获该异常。【参考方案3】:“No Records Found”文本从何而来?
使用导致异常的相同参数从 Management Studio 执行存储过程。
SSMS 会报错吗?
如果没有,请将 C# 行分成 3 个步骤:
调用存储过程
检查 != null 并调用 Select()
检查 != null 并调用 AddRange()
【讨论】:
以上是关于使用 LINQ to SQL 时如何处理 SqlException“未找到记录”?的主要内容,如果未能解决你的问题,请参考以下文章
从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?
使用 DataGridView 控件和 Access 数据库查询时如何处理错误?