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

VB程序写入SQL Server datetime字段仅存日期无时间的异常问题

解决VB程序写入SQL Server datetime字段丢失时间部分的问题

针对你遇到的问题——VB程序通过BindingSource写入SQL Server datetime字段时丢失时间,而SSMS直接执行UPDATE正常,调试变量值正确,字段和数据集均声明为datetime类型,这里提供几个排查和解决方向:

  • 检查数据集字段的Format属性
    打开数据集设计器,找到对应DataTable的LastTested字段,查看其Format属性。如果该属性被设置为d(短日期格式)或其他仅保留日期的格式,会导致写入时自动截断时间部分。将Format属性清空,或设置为G(通用日期时间格式),同时确认字段的DataType为System.DateTime。

  • 直接操作DataRow而非BindingSource.Current
    BindingSource.Current返回的是Object类型,隐式转换可能引发截断问题。尝试直接获取底层DataRow赋值:

    Dim rowView As DataRowView = DirectCast(FKMachineMeasureModulesMachineMeasureHistoryBindingSource.Current, DataRowView)
    rowView.Row("LastTested") = DateTime.Now
    
  • 排查SQL Server端的触发器或约束
    检查目标表Machine_MeasureModules是否存在针对LastTested字段的触发器,或者异常的默认约束。执行以下SQL语句验证:

    -- 检查表触发器
    SELECT name, definition FROM sys.triggers WHERE parent_id = OBJECT_ID('Machine_MeasureModules')
    -- 检查字段默认约束
    SELECT name, definition FROM sys.default_constraints 
    WHERE parent_object_id = OBJECT_ID('Machine_MeasureModules') 
      AND parent_column_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('Machine_MeasureModules') AND name = 'LastTested')
    

    如果存在自动清零时间的触发器或约束,需要修改或移除。

  • 确认TableAdapter UpdateCommand的参数类型
    若使用TableAdapter更新数据,检查其UpdateCommand中@LastTested参数的DbType设置。如果参数被错误配置为Date而非DateTime,会丢失时间部分。打开数据集设计器,找到对应TableAdapter的UpdateCommand,将参数的DbType改为DateTime。

  • 改用DateTime.Now代替Now()
    虽然VB中Now()和DateTime.Now功能接近,但强制使用DateTime.Now可以避免因项目设置(如Option Strict)导致的隐式转换问题:

    FKMachineMeasureModulesMachineMeasureHistoryBindingSource.Current("LastTested") = DateTime.Now
    

内容的提问来源于stack exchange,提问作者Werner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:26:13