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

