VB.NET向SQLite插入24小时制DateTime类型数据报错如何解决?
问题原因
- 参数类型与赋值不匹配:你为
@ROSY_FROM、@ROSY_TO两个参数指定了DbType.DateTime类型,但使用Format函数返回的是字符串类型值,类型不一致触发报错。 - 方法使用错误:
AddWithValue的第二个参数本应为参数值,你此处用来指定DbType属于混用API,会导致参数类型推断异常。 - 格式化字符串不符合需求:
HH:mm tt中的tt会输出上午/下午标识,和你需要的24小时制格式冲突。
解决方案
根据你表结构的字段类型选择对应方案:
方案1:字段为TEXT类型,存储24小时制时分字符串
直接将参数类型改为DbType.String,格式化时去掉tt即可,修正代码如下:
Dim com As New SQLiteCommand("INSERT INTO ROSY_TB(ROSY_CODE,ROSY_DESCREPTION,ROSY_FROM,ROSY_TO,ROSY_ALLOWFR,ROSY_ALLOWTO,ROSY_APSENTA,ROSY_APSENTB,ROSY_WORKHOUR,ROSY_APSENTNUM,ROSY_CHECK) VALUES (@ROSY_CODE,@ROSY_DESCREPTION,@ROSY_FROM,@ROSY_TO,@ROSY_ALLOWFR,@ROSY_ALLOWTO,@ROSY_APSENTA,@ROSY_APSENTB,@ROSY_WORKHOUR,@ROSY_APSENTNUM,@ROSY_CHECK)", con) com.Parameters.Add("@ROSY_CODE", DbType.String).Value = ROSYUPDATE_F.LAB_CODEVAL.Text com.Parameters.Add("@ROSY_DESCREPTION", DbType.String).Value = ROSYUPDATE_F.TEXT_DESCREPTION.Text ' 调整时间参数类型为String,格式化用HH:mm输出24小时制时分 com.Parameters.Add("@ROSY_FROM", DbType.String).Value = Format(ROSYUPDATE_F.DATE_FROM.Value, "HH:mm") com.Parameters.Add("@ROSY_TO", DbType.String).Value = Format(ROSYUPDATE_F.DATE_TO.Value, "HH:mm") com.Parameters.Add("@ROSY_ALLOWFR", DbType.Int64).Value = CInt(Val(ROSYUPDATE_F.TEXT_ALLOWFR.Text)) com.Parameters.Add("@ROSY_ALLOWTO", DbType.Int64).Value = CInt(Val(ROSYUPDATE_F.TEXT_ALLOWTO.Text)) com.Parameters.Add("@ROSY_APSENTA", DbType.String).Value = ROSYUPDATE_F.COM_APSENTA.SelectedItem com.Parameters.Add("@ROSY_APSENTB", DbType.String).Value = ROSYUPDATE_F.COM_APSENTB.SelectedItem com.Parameters.Add("@ROSY_WORKHOUR", DbType.Int64).Value = CInt(Val(ROSYUPDATE_F.TEXT_WORKHOUR.Text)) com.Parameters.Add("@ROSY_APSENTNUM", DbType.Int64).Value = CInt(Val(ROSYUPDATE_F.COUNTSPENT)) com.Parameters.Add("@ROSY_CHECK", DbType.Boolean).Value = True con.Open() com.ExecuteNonQuery() con.Close()
方案2:字段为时间类型,存储完整DateTime值
不需要手动格式化,直接传入DateTime对象即可,读取时再提取时分部分:
' 直接传入DateTime对象,由SQLite驱动自动处理类型转换 com.Parameters.Add("@ROSY_FROM", DbType.DateTime).Value = ROSYUPDATE_F.DATE_FROM.Value com.Parameters.Add("@ROSY_TO", DbType.DateTime).Value = ROSYUPDATE_F.DATE_TO.Value
注意事项
- SQLite本身没有原生的DateTime类型,存储时间时本质是存TEXT/REAL/INTEGER类型的值,选择存储格式时要保证读写逻辑一致。
- 指定参数类型时统一使用
Parameters.Add方法,AddWithValue仅用于不需要显式指定类型、自动推断参数类型的场景。
内容的提问来源于stack exchange,提问作者fast2021
相关产品推荐
相关产品推荐

