Tenemos un comportamiento realmente extraño e incoherente con Linq-to-SQL aquí.Linq-to-SQL y rareza DateTime
Nuestra aplicación está instalada en bastantes sitios de clientes, y funciona muy bien en su mayor parte. Una de las consultas en Linq-to-SQL actualiza una tabla y establece una columna DateTime
en un nuevo valor.
En todos los casos - incluyendo nuestros sistemas de desarrollo y prueba - esta declaración-LINQ a SQL se traduce en algo a lo largo de las líneas de:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = '2011-11-04 14:15:25', @ID = 555
Sin embargo, en el sitio de un cliente, por razones que aren 't claro para nosotros (aún), esta actualización se traduce en:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = 'Nov 4 2011 02:15:25PM', @ID = 555
y por alguna razón, entonces falla en SQL Server 2005.
Ahora, los servidores de ese cliente (servidor web y servidor SQL) tienen instaladas las versiones en inglés de EE. UU. De Windows Server 2008; el idioma en SQL Server está configurado en us_english
, el formato de fecha está establecido en mdy
, la cuenta de usuario que ejecuta la actualización tiene su idioma configurado en English
en SQL Server ..... y esa configuración es la misma en otros lugares (por ejemplo, en nuestra infraestructura de servidor de prueba).
Así que mi pregunta realmente es:
¿Por qué en la tierra hace LINQ to SQL repente crear una representación totalmente diferente de la misma
DateTime
para enviar a SQL Server? ¿Hay algún control para controlar esto?¿Y por qué ADO.NET y la base de datos SQL Server 2005 SP2 no pueden manejar la declaración
UPDATE
correctamente? Estamos recibiendo un error en nuestro registro que lee:
SqlTypeException - SqlDateTime desbordamiento. Debe estar entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM.
parece ser un error de .NET (más que un error de SQL Server) y parece como si .NET no puede realmente interpretar que Nov 4 2011 02:15:25PM
como válida DateTime
por alguna razón. Al intentar ejecutar la instrucción UPDATE generada en SQL Server Management Studio, nos parece que no puede "forzar" que el error ocurra - la UPDATE
felizmente funciona bien .....
Actualización: alguna otra investigación parece indicar Linq- a-SQL se comporta de forma diferente cuando se va en contra de SQL Server 2005 o 2008.
- con SQL Server 2005 , nuestras fechas llegar a convertirse en:
Nov 4 2011 02:15:25PM
- con SQL Server 2008 , nuestras fechas se convierten en:
2011-11-04 02:15:25PM
Compruebe la configuración de CurrentCulture para las aplicaciones C#/VB.NET. –
@BogdanSahlean: 'CurrentCulture' está establecido en' InvariantCulture' en todos los sistemas –
Estoy de acuerdo en que se trata de un problema de .NET y no de SQL. Probablemente un error en LINQ2SQL olvidando usar la cultura invariante en alguna parte. ¿La configuración de ubicación de Windows coincide? – leppie