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
相关产品推荐
相关产品推荐

