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

C# WinForms DateTimePicker能否保留毫秒?更新数据时毫秒丢失求助

解决WinForms DateTimePicker毫秒丢失及SQL CRUD精度问题

一、修正DateTimePicker的显示与值保留问题

WinForms的DateTimePicker本身支持毫秒,但显示fff而非实际毫秒数,通常是未正确启用自定义格式或赋值方式错误:

  • 必须先设置Format = DateTimePickerFormat.Custom,再指定自定义格式:
    dateTimePicker1.Format = DateTimePickerFormat.Custom;
    dateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm:ss.fff";
    
  • 从数据库读取带毫秒的时间时,直接给Value属性赋值,避免通过Text转换导致精度丢失:
    // 从DataReader读取带毫秒的DateTime对象
    DateTime dbTime = (DateTime)reader["YourDateTimeColumn"];
    dateTimePicker1.Value = dbTime;
    
    完成后控件会正确显示毫秒,且Value属性会完整保留精度信息。

二、确保SQL数据库字段的精度支持

如果数据库字段用的是datetime类型,它的精度仅为3.33毫秒,会自动截断或舍入毫秒值,必须改用高精度类型:

  • SQL Server:使用datetime2(7)(支持最高7位小数的毫秒精度)
  • MySQL:使用DATETIME(6)
  • 其他数据库对应支持高精度的日期类型

三、CRUD操作避免毫秒丢失

读取和写入时直接操作DateTime对象,禁止通过字符串中转:

更新(写入)示例:

使用参数化查询,明确指定参数为高精度日期类型:

using (SqlCommand updateCmd = new SqlCommand("UPDATE YourTable SET TimeCol = @targetTime WHERE Id = @recordId", conn))
{
    // 指定参数类型为DateTime2,确保完整传递毫秒信息
    updateCmd.Parameters.Add("@targetTime", SqlDbType.DateTime2).Value = dateTimePicker1.Value;
    updateCmd.Parameters.Add("@recordId", SqlDbType.Int).Value = yourRecordId;
    updateCmd.ExecuteNonQuery();
}

读取示例:

直接从DataReader获取DateTime对象,不要转成字符串再解析:

DateTime storedTime = (DateTime)sqlReader["TimeCol"];
// 错误示例:string timeStr = sqlReader["TimeCol"].ToString(); DateTime storedTime = DateTime.Parse(timeStr);

四、数据绑定的注意事项

如果使用BindingSource等控件绑定数据,直接绑定DateTime类型字段,避免绑定过程中做字符串格式化:

yourBindingSource.DataSource = yourDataTable;
// 直接将Value属性绑定到数据源的DateTime字段
dateTimePicker1.DataBindings.Add("Value", yourBindingSource, "TimeCol");

内容的提问来源于stack exchange,提问作者Josué Campos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:55:17