Select命令中的SqlDateTime溢出异常
我使用存储过程来获取分页列表,这是我的方法:
using(SqlConnection conn = new SqlConnection(_connectionString)) {
using(SqlCommand cmd = new SqlCommand("[GetPagedSP]", conn)) {
cmd.CommandType = System.Data.CommandType.StoredProcedure;
//Passing Parameters
**Update**
SqlParameter spCreationDate = new SqlParameter("@CreationDate_9", CreationDate);
spCreationDate.IsNullable = true;
cmd.Parameters.Add(spCreationDate);
// ........
//Finished Passing Parameters
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read()) {
//Get Values
}
conn.Close();
}
}
这是我的存储过程命令:
CREATE TABLE #PagingTemp (
[RowId] [bigint] IDENTITY(1,1) NOT NULL,
[RecordId] [bigint]
);
INSERT INTO [#PagingTemp] ([RecordId])
SELECT [CAR].[Id]
FROM [Article] AS [CAR] ;
SELECT [CAR].*
FROM [Collections].[Article] AS [CAR]
INNER JOIN [#PagingTemp] AS [PT] ON [CAR].[Id] = [PT].[RecordId]
WHERE [PT].[RowId] BETWEEN 1 AND 50;
当我在SQL中运行查询时,每件事情都很好,但是在.NET中,我在这一行中有一个例外:
SqlDataReader dr = cmd.ExecuteReader();
例外是:
System.Data.SqlTypes.SqlTypeException未被用户代码处理
消息= SqlDateTime溢出。 必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
来源= System.Data
更新
在SQL中运行查询的示例:
这太奇怪了,我不明白发生了什么事?
我没有任何datetime
值大于12/31/9999
或小于1/1/1753
我只是在数据库中有一些空值的空值datetime值。
你怎么看? 哪里有问题?
在传递它来执行存储过程之前,将任何有效日期分配给变量CreationDate
//Passing Parameters
CreationDate = DateTime.Now or any other date you want if you dont want to pass any date then assign DBNull.Value
**Update**
SqlParameter spCreationDate = new SqlParameter("@CreationDate_9", CreationDate);
spCreationDate.IsNullable = true;
cmd.Parameters.Add(spCreationDate);
希望这会解决你的问题。
如果可能的话,在这里粘贴SP,最好提出一个修补程序。 目前,您可能会考虑以下可能性来尝试修复它:
如果select导致问题,那么考虑用最短日期替换NULL日期,如下所示:
SELECT IsNULL(CreationDate,'1/1/1753') CreationDate, IsNULL(LastBidDate,'1/1/1753') LastBidDate from yourtable.
作为参考,这里是另一个回答的问题:error-sqldatetime-overflow-must-between-1-1-1753-120000-am-and-12-31-999
正如Gavin
和Nikola Markovinović
在选择命令中的注释中提到的,当您通过DateTime
类型参数时需要检查参数值是否在正确的范围内( 1/1/1753 to 12/31/9999
)? 我传递了一个Nullable DateTime
参数,我认为它的值为null,在这种情况下我也从未在查询中使用这个参数,所以null值是正确的,并且在命令中使用参数并不重要,当我再次检查我发现参数的值不为空,是1/1/0001
。 另一种解决方案是在SQL
中使用DATATIME2
类型,它支持.Net支持的所有DateTime
范围。