0

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

他们突然得到异常:“ERROR [22007] [Microsoft][SQL Server Native Client 11.0][SQL Server]varchar 数据类型到 datetime 数据类型的转换导致值超出范围。”

这个错误之前已经在这里发布过,但我没有找到任何与 Windows 10 升级相关的帖子。

该查询针对 SQL Server 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 客户端的同一个数据库工作正常。两个客户端都运行 Einglish Windows 版本。另一个有趣的观察是,从 Windows 10 机器上的 Microsoft SQL Management Studio 接受查询。但不是通过本机客户端。过滤器中使用的日期是通过 GUI 在我们的程序中创建的。

是否有人在 Windows 10 上使用 Native Client 时遇到过奇怪的事情,或者是否有人对如何解决此问题提出建议?

4

1 回答 1

2

我确认此线程中的解决方案解决了我的问题。

经过一些研究,我们发现ToString("yyyy-MM-dd HH:mm:ss")如果在运行时将当前区域性设置为“no”或“nb-NO”,则调用在 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") 是否应该根据操作系统在相同的文化中返回不同的格式?:O 这有点吓人。

于 2015-08-31T15:30:24.800 回答