使用 .ExecuteReader 时 SqlDateTime 溢出
SqlDateTime overflow when using .ExecuteReader
我在执行 asp 页面上使用的 reader 时遇到此错误:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
日期是从日历中 select 编辑的,并设置为 DateTime
变量,然后用作 SQL 命令中的参数。它似乎随机工作,我 select 一次约会并且它有效,我重新加载页面并在同一天 select 但它可能无效。
我的相关代码如下,我在 .ExecuteReader()
行收到错误。
我在执行 reader 之前检查了 confirmedDate
变量,它确实有一个有效的 DateTime
.
DateTime confirmedDate = DateTime.Parse(dateSelected);
SqlCommand command4 = new SqlCommand();
command4.Connection = gconn;
String sql4 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < @dateSelected AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= @dateSelected)";
command4.CommandText = sql4;
command4.Parameters.Add(new SqlParameter("@User_ID", ""));
command4.Parameters.Add(new SqlParameter("@dateSelected", confirmedDate));
for (int i = 0; i < firstName.Count; i++ )
{
command4.Parameters["@User_ID"].Value = userID[i];
using (SqlDataReader reader = command4.ExecuteReader()) //error here
{
while (reader.Read())
{
if (reader.HasRows)
{
if (reader["TheDay"].ToString() == "")
{
dates.Add("NULL");
}
else
{
dates.Add(reader["TheDay"].ToString());
}
}
}
}
}
我已经查找了与此相关的其他问题,但找不到有效的解决方案。始终传入有效的 DateTime
值。
.net DateTime
对象的可能范围不同于 Sql Server DateTime 对象。在将其插入 sql 查询之前,您应该进行一些参数验证。
这是一个例子。
DateTime confirmedDate = DateTime.Parse(dateSelected);
if(confirmedDate > DateTime.Now) throw new ArgumentOutOfRangeException("Date time cannot be in the future");
if(confirmedDate.Year < 1990) throw new ArgumentOutOfRangeException("Sorry, we only have data starting from the year 1990");
还要在参数中指定数据类型。
command4.Parameters.Add(new SqlParameter("@dateSelected", SqlDbType.DateTime){Value = confirmedDate}));
.Net DateTime 的范围
- Min DateTime - 00:00:00.0000000 UTC,0001 年 1 月 1 日
- Max DateTime - 23:59:59.9999999 UTC,9999 年 12 月 31 日
- 最小值 - 1/1/1753 12:00:00 AM
- 最大值 - 12/31/9999 11:59:59 下午
将第二个@dateSelected 替换为另一个名称@dateselected2,并将其添加为第三个参数。
我在执行 asp 页面上使用的 reader 时遇到此错误:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
日期是从日历中 select 编辑的,并设置为 DateTime
变量,然后用作 SQL 命令中的参数。它似乎随机工作,我 select 一次约会并且它有效,我重新加载页面并在同一天 select 但它可能无效。
我的相关代码如下,我在 .ExecuteReader()
行收到错误。
我在执行 reader 之前检查了 confirmedDate
变量,它确实有一个有效的 DateTime
.
DateTime confirmedDate = DateTime.Parse(dateSelected);
SqlCommand command4 = new SqlCommand();
command4.Connection = gconn;
String sql4 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < @dateSelected AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= @dateSelected)";
command4.CommandText = sql4;
command4.Parameters.Add(new SqlParameter("@User_ID", ""));
command4.Parameters.Add(new SqlParameter("@dateSelected", confirmedDate));
for (int i = 0; i < firstName.Count; i++ )
{
command4.Parameters["@User_ID"].Value = userID[i];
using (SqlDataReader reader = command4.ExecuteReader()) //error here
{
while (reader.Read())
{
if (reader.HasRows)
{
if (reader["TheDay"].ToString() == "")
{
dates.Add("NULL");
}
else
{
dates.Add(reader["TheDay"].ToString());
}
}
}
}
}
我已经查找了与此相关的其他问题,但找不到有效的解决方案。始终传入有效的 DateTime
值。
.net DateTime
对象的可能范围不同于 Sql Server DateTime 对象。在将其插入 sql 查询之前,您应该进行一些参数验证。
这是一个例子。
DateTime confirmedDate = DateTime.Parse(dateSelected);
if(confirmedDate > DateTime.Now) throw new ArgumentOutOfRangeException("Date time cannot be in the future");
if(confirmedDate.Year < 1990) throw new ArgumentOutOfRangeException("Sorry, we only have data starting from the year 1990");
还要在参数中指定数据类型。
command4.Parameters.Add(new SqlParameter("@dateSelected", SqlDbType.DateTime){Value = confirmedDate}));
.Net DateTime 的范围
- Min DateTime - 00:00:00.0000000 UTC,0001 年 1 月 1 日
- Max DateTime - 23:59:59.9999999 UTC,9999 年 12 月 31 日
- 最小值 - 1/1/1753 12:00:00 AM
- 最大值 - 12/31/9999 11:59:59 下午
将第二个@dateSelected 替换为另一个名称@dateselected2,并将其添加为第三个参数。