C# 当查询结果超过1000条记录时,Dapper引发System.Data.SqlClient.SqlException

C# 当查询结果超过1000条记录时,Dapper引发System.Data.SqlClient.SqlException,c#,sql,sql-server,dapper,dapper-extensions,C#,Sql,Sql Server,Dapper,Dapper Extensions,下面的方法调用失败,并显示消息“将varchar数据类型转换为datetime数据类型导致值超出范围”: 公共IEnumerable GetResults(SqlConnection连接,字符串属性) { var sql=string.Format(@) 选择2000强 r、 身份证 ,r.LastName ,r.FirstName ,r.Ssn ,r.CurrentId ,BeginDate=当isdate(rli.BeginDate)=1时的情况,然后转换(datetime,rli.Begi

下面的方法调用失败,并显示消息“将varchar数据类型转换为datetime数据类型导致值超出范围”:

公共IEnumerable GetResults(SqlConnection连接,字符串属性) { var sql=string.Format(@) 选择2000强 r、 身份证 ,r.LastName ,r.FirstName ,r.Ssn ,r.CurrentId ,BeginDate=当isdate(rli.BeginDate)=1时的情况,然后转换(datetime,rli.BeginDate)为空结束 ,EndDate=当isdate(rli.EndDate)=1时的情况,然后转换(datetime,rli.EndDate),否则为空结束 ,rli.LcknTyCd ,rli.ProvId 从…起 [dbo][Span]rli 内部联接[dbo]。收件人r 在rli.SysId=r.SysId上 内部联接[dbo].ValidRecipient lc 在r.SysId=lc.SysId上 哪里 BeginDate=GETDATE() 和rli.LcknTyCd=@LcknTyCd); 返回connection.Query(sql,new{LcknTyCd=attribute}).ToList(); } 公共结构SomeResult { 公共字符串Id{get;set;} 公共字符串LastName{get;set;} 公共字符串名{get;set;} 公共字符串Ssn{get;set;} 公共字符串CurrentId{get;set;} 公共日期时间?BeginDate{get;set;} 公共日期时间?结束日期{get;set;} 公共字符串LcknTyCd{get;set;} 公共字符串ProvId{get;set;} } 如果结果集包含1000条(或更少)记录,则代码正常工作。当我在SQL Server Management Studio(2014版)中执行查询时,我也没有收到任何错误。即使我在SSMS中从“选择并执行”列表中删除顶部,也不会发生错误(如预期的那样,返回12000多条记录)


要成功检索超过1000行的结果集,我应该做什么来代替上面的实现?在这种情况下,存储过程更合适吗?

听起来日期字段存储在varchar列中。 理想情况下,您应该将这些字段更改为datetime字段。 如果这不是一个选项,请将
WHERE
子句更改为如下所示:

WHERE 
  case when isdate(rli.BeginDate) = 1 then convert(datetime, rli.BeginDate) else NULL end <= GETDATE()
  AND case when isdate(rli.EndDate) = 1 then convert(datetime, rli.EndDate) else NULL end >= GETDATE()
  AND rli.LcknTyCd = @LcknTyCd);
在哪里
当isdate(rli.BeginDate)=1,然后转换(datetime,rli.BeginDate)时的情况,否则NULL end=GETDATE()
和rli.LcknTyCd=@LcknTyCd);

它在top 1000查询中成功的原因可能是因为top 1000记录找到了所有包含有效日期的记录。

这是一个数据库服务器错误:dapper不知道varchar,也不理解varchar的含义-它谈论的是.net
字符串
s。因此:存储为varchar的一个日期已损坏,并且不包含有效值

基本上:在SSMS中尝试这个查询:我希望它也会在那里中断


更改为存储过程根本不会改变这一点。需要更改的是已损坏的数据,而且(更重要的是)将日期/时间数据存储在基于文本的列中的错误选择。

BeginDate和EndDate的数据类型是什么?它包含什么格式的数据?如果没有订单,也无法保证您将获得2000行。我严重怀疑这与Dapper有任何关系。该异常完全无关。我已将我的问题更新为反映出我在SQLServerManagementStudio中尝试过此查询的各种变体,它们都能正常工作。BeginDate和EndDate(不幸的是)是varchar(8)。我将尝试添加一个ORDER BY子句,看看它是否/如何更改我的结果。不幸的是,数据类型的选择不是我的选择。我在SSMS中测试了该查询,在将其添加到我的代码之前没有出现任何错误。@ScottA.Lawrence,您是否根据实际数据进行了测试?或者仅针对您的本地/dev数据进行了测试?根据实际数据进行了测试(从生产环境更新的暂存环境中的数据)。我将尝试按照您的建议更改WHERE子句,看看是否可以解决此错误。非常感谢您的帮助。当我按照您的建议更新WHERE子句时,不再出现错误。我仍然不确定SSMS为什么没有在以前的查询中给我错误,但您的建议解决了我的问题。
WHERE 
  case when isdate(rli.BeginDate) = 1 then convert(datetime, rli.BeginDate) else NULL end <= GETDATE()
  AND case when isdate(rli.EndDate) = 1 then convert(datetime, rli.EndDate) else NULL end >= GETDATE()
  AND rli.LcknTyCd = @LcknTyCd);