VB.NET程序中DateTimePicker赋值时出现有效DateTime识别错误的求助
解决VB.NET中DateTimePicker日期解析错误的问题
你遇到的这个错误String was not recognized as a valid DateTime because the day of week was incorrect,核心原因是直接给DateTimePicker的Text属性赋值包含星期全称的字符串(比如"Minggu/05/2024")时,.NET的日期解析器无法正确识别这种格式——它会尝试把星期部分当作日期的一部分去解析,自然就会抛出无效日期的错误。
下面是具体的修复方案,按优先级排序:
1. 直接赋值DateTime类型给Value属性(推荐)
数据库中的日期字段如果是DateTime类型,从OleDbDataReader读取时直接转换成DateTime,然后赋值给DateTimePicker的Value属性,完全绕开字符串解析的问题:
' 替换原来的dtp_xxx.Text赋值代码,改成如下形式 dtp_surat_pengantar_rt.Value = CDate(RD.Item("tgl_srt_pngtr_rt")) dtp_surat_Pengantar_camat.Value = CDate(RD.Item("tgl_srt_pngtr_cmt")) dtp_surat_acara_kesaksian.Value = CDate(RD.Item("tgl_brt_acr_sksi")) dtp_surat_keterangan.Value = CDate(RD.Item("tgl_srt_ktrgn")) dtp_surat_pemohon.Value = CDate(RD.Item("tgl_srt_pmh")) dtp_tgl_surat_riwayat_kuasa.Value = CDate(RD.Item("tgl_srt_rwyt_ksa"))
如果数据库中日期是以字符串形式存储的(不推荐这种设计),就需要用DateTime.ParseExact指定精确格式来解析:
' 需要先引入System.Globalization命名空间 Imports System.Globalization ' 示例代码 Dim tglRtStr As String = RD.Item("tgl_srt_pngtr_rt").ToString() dtp_surat_pengantar_rt.Value = DateTime.ParseExact(tglRtStr, "dddd/MM/yyyy", CultureInfo.InvariantCulture)
2. 正确配置DateTimePicker的显示格式
确保你的DateTimePicker控件已经设置为自定义格式显示:
- 在设计器中选中DateTimePicker,把
Format属性设置为Custom - 把
CustomFormat属性设置为dddd/MM/yyyy
这样控件会自动将Value属性中的DateTime值按照你想要的格式显示,不需要手动处理字符串。
3. 额外的优化建议
处理DBNull值
如果数据库中可能存在空日期,需要添加空值判断,避免转换出错:
If Not RD.IsDBNull(RD.GetOrdinal("tgl_srt_pngtr_rt")) Then dtp_surat_pengantar_rt.Value = CDate(RD.Item("tgl_srt_pngtr_rt")) Else ' 可以设置控件为空,或者给出默认值 dtp_surat_pengantar_rt.Value = DateTime.Now ' 或者根据需求处理 End If
避免SQL注入风险
你当前的SQL语句用了字符串拼接,存在严重的SQL注入风险,建议改用参数化查询:
CMD = New OleDbCommand("select * From data_surat where kode_nomor=?", Conn) CMD.Parameters.AddWithValue("@kode", Textbox_kode_nomor.Text)
按照以上步骤修改后,应该就能解决日期解析的错误了。
内容的提问来源于stack exchange,提问作者Sirkof Harryo
相关产品推荐
相关产品推荐

