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

如何在服务端更新编辑SQL数据库日期时间 编辑时无法读取时间字段

问题原因与修复方案

1. 日期格式化错误

你当前使用的日期格式字符串dd-MM-YYYY存在语法错误,C#中代表公历年的格式符为小写yyyy,大写YYYY是ISO 8601周历的年份,会直接导致日期转换异常,需要修正为dd-MM-yyyy。

2. 字段索引取值不稳定

你用SELECT *查询后直接用固定索引(4、5、6)读取字段值,只要EVENT表后续调整过字段顺序、新增过字段,索引对应的字段就会发生偏移,大概率你当前取的4、5、6索引根本不是目标Date、StartTime、EndTime字段。
建议直接通过字段名取值,彻底避免索引错位问题。

3. 可空字段未做兼容处理

如果你的Date、StartTime、EndTime字段允许为NULL,直接调用GetDateTime、GetTimeSpan会触发类型转换异常,需要先判断字段是否为DBNull再做转换。

4. 存在SQL注入风险

直接拼接Event_ID到SQL语句中会存在SQL注入漏洞,建议改为参数化查询。


修复后的代码示例

// 改用参数化查询避免SQL注入风险
SqlCommand UpdateEvent = new SqlCommand
{
    CommandText = "SELECT * FROM EVENT WHERE Event_ID = @EventID",
    CommandType = CommandType.Text,
    Connection = con
};
// 添加SQL参数
UpdateEvent.Parameters.AddWithValue("@EventID", Event_ID);

con.Open(); 

if (con.State == ConnectionState.Open)  
{
    SqlDataReader readEvent = UpdateEvent.ExecuteReader();
    while (readEvent.Read()) 
    {  
        this.EventNameHeader.InnerHtml = "<h2 class='standardheader'>Update " + readEvent.GetInt32("G_ID") + "</h2>";
        this.CtrlEvent_ID.Value = readEvent.GetInt32("Event_ID").ToString();
        this.CtrlG_ID.Text = readEvent.GetInt32("G_ID").ToString();
        this.CtrlF_Event.Text = readEvent.GetString("F_Event");
        this.CtrlE_Venue.Text = readEvent.GetString("E_Venue");
        // 判空后读取日期字段,修正日期格式符
        if (!readEvent.IsDBNull(readEvent.GetOrdinal("E_Date")))
        {
            this.CtrlE_Date.Value = readEvent.GetDateTime("E_Date").Date.ToString("dd-MM-yyyy");
        }
        // 判空后读取开始时间
        if (!readEvent.IsDBNull(readEvent.GetOrdinal("E_StartTime")))
        {
            this.CtrlE_StartTime.SelectedValue = readEvent.GetTimeSpan("E_StartTime").ToString(@"hh\:mm\:ss");
        }
        // 判空后读取结束时间
        if (!readEvent.IsDBNull(readEvent.GetOrdinal("E_EndTime")))
        {
            this.CtrlE_EndTime.SelectedValue = readEvent.GetTimeSpan("E_EndTime").ToString(@"hh\:mm\:ss");
        }
        this.CtrlE_Desc.Text = readEvent.GetString("E_Desc");
        this.CtrlW_Record.Text = readEvent.GetString("W_Record");
    }
    readEvent.Close();
}
else
{
    Response.Write("SQL DB Connect Failed");
}

con.Close();

额外注意

  • 请将代码中的字段名替换为你EVENT表内的实际字段名
  • 如果你的StartTime、EndTime字段在数据库中是datetime类型而不是time类型,不能用GetTimeSpan取值,要改成GetDateTime之后再取TimeOfDay:
this.CtrlE_StartTime.SelectedValue = readEvent.GetDateTime("E_StartTime").TimeOfDay.ToString(@"hh\:mm\:ss");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:03