如何在服务端更新编辑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
相关产品推荐
相关产品推荐

