我们在WinForms程序中长时间使用以下SQL查询没有问题,直到一些最终用户升级到Windows 10.
他们突然得到异常:" ERROR [22007] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]将varchar数据类型转换为日期时间数据类型导致了范围值。"
此错误已在此处发布到此处,但我没有找到任何发布连接到Windows 10升级的帖子。
使用Native Client 11将查询定位到SQL Server 2012.它适用于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客户端的同一个DB上运行正常。两个客户端都运行Einglish Windows版本。另一个有趣的观察是,该查询是从Windows 10计算机上的Microsoft SQL Management Studio接受的。但不是通过本地客户端。过滤器中使用的日期是通过GUI在我们的程序中创建的。
让其他人在Windows 10上遇到使用Native Client的奇怪事情,或者是否有人建议如何解决此问题?
答案 0 :(得分:2)
我确认the solution purposed in this thread解决了我的问题。
经过一些研究后,如果当前文化在运行时设置为“no”或“nb-NO”(ToString("yyyy-MM-dd HH:mm:ss")
),我们发现Thread.CurrentThread.CurrentCulture = new CultureInfo("no");
调用在Windows 7和Windows 10中的响应方式不同。
建议的修改可以解决问题:ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)
。这解决了我的问题,因为时间格式中的点是其根本原因。
但ToString(“yyyy-MM-dd HH:mm:ss”)应该根据操作系统在同一文化中返回不同的格式吗? :O这有点可怕。