You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET VB.NET:char转smalldatetime超出范围错误求助

解决Calendar控件日期转smalldatetime超出范围问题

问题根源

SQL Server的smalldatetime类型支持范围是1900年1月1日 00:00:00至2079年6月6日 23:59:00,你的2020-2021日期范围本身符合要求,错误核心是日期格式转换时解析异常:

  • 可能是Calendar日期转字符串时格式不规范(比如用MM/DD/YYYY格式,数据库误识别为DD/MM/YYYY,导致月份、日期颠倒)
  • 也可能是直接拼接SQL字符串传递日期,引发格式解析错误

解决方法

1. 使用参数化查询(最优方案)

避免字符串拼接,直接传递DateTime类型参数,彻底规避格式问题:

// 获取Calendar选中日期
DateTime selectedDate = calFrom.SelectedDate;

// 构建参数化SQL
string sql = "SELECT * FROM 你的表名 WHERE 日期字段 = @SelectedDate";
using (SqlConnection conn = new SqlConnection(你的连接字符串))
{
    SqlCommand cmd = new SqlCommand(sql, conn);
    // 直接传入DateTime类型,无需格式转换
    cmd.Parameters.AddWithValue("@SelectedDate", selectedDate);
    conn.Open();
    // 执行查询逻辑
}

2. 限制Calendar可选日期范围

在后台代码中限制用户只能选择指定区间的日期,从源头避免无效日期:
前台ASPX代码:

<asp:Calendar ID="calFrom" runat="server" 
    SelectionMode="Day" 
    OnDayRender="calFrom_DayRender">
</asp:Calendar>

后台C#代码:

protected void calFrom_DayRender(object sender, DayRenderEventArgs e)
{
    DateTime minDate = new DateTime(2020, 7, 20);
    DateTime maxDate = new DateTime(2021, 7, 20);
    
    // 禁用超出范围的日期
    if (e.Day.Date < minDate || e.Day.Date > maxDate)
    {
        e.Day.IsSelectable = false;
        e.Cell.BackColor = System.Drawing.Color.LightGray;
    }
}

3. 显式指定日期格式(若需字符串传递)

如果必须用字符串传递日期,使用SQL Server能稳定识别的ISO 8601格式:

string formattedDate = calFrom.SelectedDate.ToString("yyyy-MM-dd");
// 同样用参数化方式传递该字符串,禁止直接拼接SQL

错误提示本质是数据库将字符串解析成了超出smalldatetime范围的日期(比如把"07/20/2020"识别为2020年20月7日),参数化查询是最稳妥的解决方式。

内容的提问来源于stack exchange,提问作者user2501024

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:12:47