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

时间:2015-08-31 11:05:45

标签: datetime sql-server-2012 windows-10 sql-server-native-client

我们在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的奇怪事情,或者是否有人建议如何解决此问题?

1 个答案:

答案 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这有点可怕。