MSSQL 查询不再适用于 Windows 10 客户端:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

MSSQL query no longer works with Windows 10 client: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

我们在 WinForms 程序中使用以下 SQL 查询已经很长时间了,没有任何问题,直到一些最终用户升级到 Windows 10。

他们突然得到异常:"ERROR [22007] [Microsoft][SQL Server Native Client 11.0][SQL Server]The conversion of a varchar data type to a datetime data type resulted in an out-of-range value."

此错误之前已post编辑到此处,但我没有发现任何 post 发生的事件与 Windows 10 升级有关。

查询针对 SQL 服务器 2012,使用 Native Client 11。它在 windows 7 和 8 上工作,但在 Windows 10 中抛出异常:

SELECT DISTINCT tblEmployee.EmployeeID, tblEmployee.Lastname, (COALESCE(tblEmployee.Firstname, '') + ' (' + COALESCE(tblEmployee.EmployeeIDText, '') +')' ) AS Firstname 
FROM tblEmployee 
LEFT JOIN tblAssignmentService ON tblEmployee.EmployeeID = tblAssignmentService.EmployeeID 
WHERE tblAssignmentService.ServiceDate >= '2015-08-31 00.00.00' 
AND tblAssignmentService.ServiceDate < '2015-09-07 00.00.00' 
ORDER BY tblEmployee.Lastname;

唯一使用 DateTime 字段的地方是在 Where 子句中,查询在具有 windows 8 客户端的同一个数据库中工作正常。两个客户端 运行 英语 Windows 版本。另一个有趣的观察结果是 Windows 10 机器上的 Microsoft SQL Management Studio 接受了查询。但不是通过本机客户端。过滤器中使用的日期是通过 GUI 在我们的程序中创建的。

其他人在 Windows 10 上遇到过使用 Native Client 的奇怪事情,或者有人对如何解决这个问题有建议吗?

我确认 the solution purposed in this thread 解决了我的问题。

经过一些研究,我们发现如果当前文化设置为 "no" 或 [=23],ToString("yyyy-MM-dd HH:mm:ss") 调用在 Windows 7 和 Windows 10 中的响应不同=] 在运行时 (Thread.CurrentThread.CurrentCulture = new CultureInfo("no");).

建议的修改成功了:ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)。这解决了我的问题,因为时间格式中的点是其根本原因。

但是 ToString("yyyy-MM-dd HH:mm:ss") return 是否应该根据 OS 在同一文化中使用不同的格式? :O 这有点吓人。