SQL Server隐式转换错误:datetime转timestamp不允许,参数传递排查
解决隐式转换datetime到timestamp的错误
咱们先把这个错误的根源搞清楚——你看到的timestamp可不是你以为的日期时间类型!在SQL Server里,timestamp(现在官方推荐用rowversion作为别名)是一种二进制数据类型,专门用来跟踪表行的修改版本,和日期时间半毛钱关系都没有。这个错误说明你的代码里存在把datetime类型的值试图隐式转成timestamp的操作,而SQL Server不允许这种转换。
看你贴的代码,C#端传递DateTime、存储过程参数定义为datetime本身是没问题的,问题大概率出在存储过程的内部逻辑里:
- 你可能在存储过程中把
@BirthDate这个datetime参数直接赋值给了一个timestamp/rowversion类型的表列——但要注意,timestamp列是SQL Server自动维护的,根本不需要手动赋值! - 也有可能是你的参数名
@BirthDate和表中的某个timestamp类型列重名了,导致SQL Server混淆了类型。
给你几个具体的解决步骤:
- 打开你的存储过程,检查所有用到
@BirthDate的语句,确认是否有把它赋值给timestamp类型列的操作,如果有,直接删掉那行赋值代码。 - 如果是参数名和表列名冲突,修改参数名(比如改成
@InputBirthDate)或者调整表列名,避免类型混淆。 - 另外,建议在C#中添加参数时明确指定
SqlDbType,比AddWithValue更安全,能避免潜在的类型转换问题:
sqlCommand.Parameters.Add("@BirthDate", SqlDbType.DateTime).Value = dateTime;
内容的提问来源于stack exchange,提问作者Neeraj Kumar
相关产品推荐
相关产品推荐

