【发布时间】:2015-03-25 19:08:10
【问题描述】:
以下方法调用失败,并显示消息“将 varchar 数据类型转换为日期时间数据类型导致值超出范围。”:
public IEnumerable<SomeResult> GetResults(SqlConnection connection, string attribute)
{
var sql = string.Format(@"
SELECT TOP 2000
r.Id
,r.LastName
,r.FirstName
,r.Ssn
,r.CurrentId
,BeginDate = case when isdate(rli.BeginDate) = 1 then convert(datetime, rli.BeginDate) else NULL end
,EndDate = case when isdate(rli.EndDate) = 1 then convert(datetime, rli.EndDate) else NULL end
,rli.LcknTyCd
,rli.ProvId
FROM
[dbo].[Span] rli
INNER JOIN [dbo].Recipient r
ON rli.SysId = r.SysId
INNER JOIN [dbo].ValidRecipient lc
ON r.SysId = lc.SysId
WHERE
BeginDate <= GETDATE()
AND EndDate >= GETDATE()
AND rli.LcknTyCd = @LcknTyCd);
return connection.Query<SomeResult>(sql, new { LcknTyCd = attribute}).ToList();
}
public struct SomeResult
{
public string Id{ get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Ssn { get; set; }
public string CurrentId{ get; set; }
public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; }
public string LcknTyCd{ get; set; }
public string ProvId{ get; set; }
}
如果结果集包含 1000 条(或更少)记录,则代码可以正常工作。当我在 SQL Server Management Studio(2014 版)中执行查询时,我也没有收到错误消息。即使我从选择中删除 TOP 并在 SSMS 中执行它,也不会发生错误(如预期的那样返回了 12,000 多条记录)。
我应该怎么做而不是上面的实现来成功检索超过 1000 行的结果集?在这种情况下,存储过程会更合适吗?
【问题讨论】:
-
BeginDate 和 EndDate 的数据类型是什么?它包含什么格式的数据?此外,如果没有订单,也无法保证您将获得 2,000 行。
-
我严重怀疑这与 Dapper 有任何关系。该异常完全不相关。
-
我已经更新了我的问题,以反映我已经在 SQL Server Management Studio 中尝试了此查询的变体,这些变体都可以正常工作。 BeginDate 和 EndDate 是(不幸的是我)varchar(8)。我会尝试添加一个 ORDER BY 子句,看看是否/如何改变我的结果。
标签: c# sql sql-server dapper dapper-extensions