要使用“SQL Server 的 OLE DB 驱动程序”,我将连接字符串中的提供程序从应Provider=SQLOLEDB.1
更改Provider=MSOLEDBSQL
为 。现在,如果我将日期 31.12.2099 分配给 DBTimeStamp 类型的 OLE DB 参数,则会收到错误“日期格式无效”:
cmd.Parameters.Add("@ValidFrom", OleDbType.DBTimeStamp).Value = new DateTime(2099, 12, 31);
我发现 OleDbType.DBTimeStamp (DBTYPE_DBTIMESTAMP) 映射到 SQL SERVER 数据类型smalldatetime,其范围从 1900-01-01 到 2079-06-06。事实上,如果我将它从 31.12.2099 更改为 06.06.2079,它可以正常工作(另请参阅https://docs.microsoft.com/en-us/answers/questions/175510/oledbtype-dbtimestamp-in-oledbdataadapter-错误-be.html )。
解决方案是使用 OleDbType.DBDate 而不是 OleDbType.DBTimeStamp。但是,如果我也想保持时间呢?所以我的问题是:
- 为什么我在更换连接提供商之前没有这个问题?似乎这个范围限制被忽略了。
- 我现在应该使用哪种类型来保留日期和时间?只有三种与日期时间相关的 OLE DB 类型:DBDate、DBTime 和 DBTimeStamp。
评论
尝试按照此链接中的说明设置比例不起作用(当 DataTypeCompatility 开启时,如何将 12/30/1899 参数化为 SQL Server 本机客户端?)。
var param = cmd.Parameters.Add("@ValidFrom", OleDbType.DBTimeStamp);
param.Scale = 3;
param.Value = new DateTime(2099, 12, 31);
在这种情况下,我收到以下错误:
The fractional part of the provided time value overflows the scale of the corresponding SQL Server parameter or column. Increase bScale in DBPARAMBINDINFO or column scale to correct this error.
当我如前所述更改连接字符串时,我遇到了同样的错误。然后我通过添加DataTypeCompatibility=80
到连接字符串来解决它,这很好(另见https://social.msdn.microsoft.com/Forums/en-US/1241147c-42a1-40a5-b4c6-374374e462cd/the-fractional-part -of-the-provided-time-value-overflows-the-scale-of-the-corresponding-sql-server?forum=transactsql)。