VB.NET 格式化DataTable DateTime列为yyyy/MM/dd HH:mm格式字符串的报错排查
VB.NET DataTable DateTime列格式化报错排查
核心错误点
1. 对Object类型直接调用带格式化参数的ToString(最可能的运行时报错根源)
r2.Item(value.ColumnName)是DataRow的Item索引器,返回值为Object类型,而Object类本身没有接受字符串格式化参数的ToString重载,只有DateTime、数值等具体值类型才支持传格式化参数的ToString方法。- 如果开启了
Option Strict On,这个错误会在编译阶段就被检测出来;如果没开启Option Strict,会在运行时抛出找不到方法重载的异常。 - 直接对Object类型调用
ToString("yyyy/MM/dd HH:mm:ss")会抛出错误。 - 修复方式:先判断单元格非空,再显式转换为DateTime类型后调用格式化:
' 遍历列的逻辑保持不变,调整内部判断逻辑 For Each value As DataColumn In dt2.Columns If value.DataType Is GetType(DateTime) Then ' 先判断单元格是否为DBNull,避免空值转换报错 If Not IsDBNull(r2.Item(value.ColumnName)) Then Dim dateValue As DateTime = CType(r2.Item(value.ColumnName), DateTime) ' 直接使用你需要的yyyy/MM/dd HH:mm格式,去掉多余的秒 Dim dateStr As String = dateValue.ToString("yyyy/MM/dd HH:mm") dq &= value.ColumnName & " = '" & dateStr & "' and " End If End If Next
2. 列类型判断写法不严谨
- 原有写法
value.DataType = System.Type.GetType("System.DateTime")在多程序集引用、特殊类型加载规则的场景下,可能因为Type.GetType返回null导致判断失效。更稳妥的写法是直接使用VB.NET内置的GetType(DateTime)获取类型引用,用Is做引用对比。
3. 格式化参数和需求不匹配
- 你需求是输出不含秒的
yyyy/MM/dd HH:mm格式,原有代码的格式化串yyyy/MM/dd HH:mm:ss会多输出秒级内容,不符合预期。
4. 潜在优化建议:避免手动拼接SQL
- 直接拼接字符串生成查询条件的方式,一方面存在SQL注入风险,另一方面手动格式化的日期字符串在区域设置不匹配的场景下,可能出现数据库解析错误。后续更建议改用参数化查询处理DateTime类型的条件,无需手动格式化字符串。
内容的提问来源于stack exchange,提问作者sharkyenergy
相关产品推荐
相关产品推荐

