Chúng tôi có hành vi thực sự lạ và không nhất quán với Linq-to-SQL tại đây.LINQ-to-SQL và sự kỳ lạ ngày giờ
Ứng dụng của chúng tôi được cài đặt tại một vài trang web của khách hàng và nó hoạt động tốt cho hầu hết các phần. Một trong các truy vấn trong LINQ to SQL cập nhật bảng và đặt cột DateTime
thành giá trị mới.
Trong tất cả các trường hợp - bao gồm hệ thống phát triển và thử nghiệm của chúng tôi - đây tuyên bố LINQ-to-SQL được dịch sang một cái gì đó dọc theo dòng:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = '2011-11-04 14:15:25', @ID = 555
Tuy nhiên, tại khu vực một của khách hàng, vì những lý do mà aren 't rõ ràng đối với chúng tôi (chưa), bản cập nhật này được dịch sang:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = 'Nov 4 2011 02:15:25PM', @ID = 555
và đối với một số lý do sau đó không thành công trên SQL Server 2005.
Hiện tại, các máy chủ của khách hàng (máy chủ web và Máy chủ SQL) đã cài đặt các phiên bản Windows Server 2008 bằng tiếng Anh; ngôn ngữ trong SQL Server được đặt thành us_english
, định dạng ngày được đặt thành mdy
, tài khoản người dùng chạy bản cập nhật có ngôn ngữ được đặt thành English
trong SQL Server ..... và thiết lập đó giống nhau ở nơi khác (ví dụ, trên cơ sở hạ tầng máy chủ thử nghiệm của chúng tôi).
Vì vậy, câu hỏi của tôi thực sự là:
Tại sao trên trái đất không LINQ-to-SQL bất ngờ tạo ra một đại diện hoàn toàn khác nhau của cùng một
DateTime
gửi đến SQL Server? Có núm xoay nào để điều khiển cái này không?Và tại sao không thể ADO.NET và cơ sở dữ liệu SQL Server 2005 SP2 xử lý câu lệnh
UPDATE
chính xác? Chúng tôi đang nhận được một lỗi trong nhật ký của chúng tôi mà đọc:
SqlTypeException - SqlDateTime tràn. Phải từ 1/1/1753 12:00:00 AM và 12/31/9999 11:59:59 PM.
Nó có vẻ là một lỗi NET (hơn một lỗi SQL Server) và nó có vẻ như thể .NET có thể không thực sự giải thích rằng Nov 4 2011 02:15:25PM
như một giá trị DateTime
đối với một số lý do. Khi cố gắng để chạy các câu lệnh UPDATE được tạo ra trong SQL Server Management Studio, chúng tôi dường như không thể "buộc" lỗi điều đó xảy ra - các UPDATE
vui vẻ làm việc tốt .....
Cập nhật: một số nghiên cứu thêm dường như chỉ ra Linq- to-SQL cư xử khác nhau khi đi ngược lại SQL server 2005 hoặc 2008.
- với SQL server 2005 , ngày của chúng tôi được trở thành:
Nov 4 2011 02:15:25PM
- với SQL server 2008 , ngày của chúng tôi được chuyển thành:
2011-11-04 02:15:25PM
Vui lòng kiểm tra cài đặt CurrentCulture của bạn cho (các) ứng dụng C#/VB.NET. –
@BogdanSahlean: 'CurrentCulture' được đặt thành' InvariantCulture' trên tất cả các hệ thống –
Tôi đồng ý rằng đây là vấn đề .NET chứ không phải SQL. Có lẽ một lỗi trong LINQ2SQL quên sử dụng văn hóa bất biến ở đâu đó. Cài đặt Vị trí Windows có khớp không? – leppie