15

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à:

  1. 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?

  2. 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
+0

Vui lòng kiểm tra cài đặt CurrentCulture của bạn cho (các) ứng dụng C#/VB.NET. –

+0

@BogdanSahlean: 'CurrentCulture' được đặt thành' InvariantCulture' trên tất cả các hệ thống –

+0

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

Trả lời

3

Tôi nghĩ bạn có thể đang theo đuổi vấn đề sai.

tôi lần đầu tiên sẽ kiểm tra:

  1. LINQ to SQL schema mô hình/cơ sở dữ liệu của bạn là chính xác.
  2. Logic vấn đề của bạn để đảm bảo không có cách nào giá trị DateTime mới có thể nằm ngoài phạm vi. Đặc biệt, hãy kiểm tra xem nó có thể không là DateTime.MinValue hoặc DateTime.MaxValue.
  3. Bạn không thực hiện bất kỳ chuỗi nào để phân tích cú pháp trong ứng dụng của mình.
  4. Máy chủ SQL   không có bất kỳ trình kích hoạt nào (đặc biệt thay vì các kích hoạt , có thể sửa đổi câu lệnh cập nhật).

Tôi đoán bạn (hoặc khách hàng của bạn) bắt đầu bằng cách nhận 'tràn SqlTypeException - SqlDateTime. Phải trong khoảng thời gian từ 1/1/1753 12:00:00 sáng và 12/31/9999 11:59:59 PM 'và sau khi điều tra, bạn nhận thấy sự khác biệt về cách hiển thị ngày tháng.

Bạn không đề cập đến thông tin đến từ đâu, vì vậy tôi giả định một cái gì đó giống như trình lược tả SQL.

Tuy nhiên, sự cố hiển thị ngày có thể là trích dẫn màu đỏ vì nó không phải là vấn đề.

với SQL Server 2005, ngày của chúng tôi được trở thành: 04 tháng 11 năm 2011 02:15:25

với SQL Server 2008, ngày của chúng tôi được trở thành: 2011/11/04 02:15:25

Tôi không chắc chắn ý bạn là gì. SQL không 'lượt' ngày thành chuỗi vì nó không lưu ngày tháng dưới dạng chuỗi, nhưng biểu diễn nội bộ là một số (giống như số ngày kể từ ngày 1 tháng 1 năm 1900).

Nếu bạn có nghĩa là ngày của bạn nhận được hiển thị là ngày 4 tháng 11 năm 2011 02:15:25 PM, thì điều đó tùy thuộc vào chương trình đang hiển thị thông tin. Ngoài ra, như tôi hiểu nó, nếu bạn đang sử dụng một tham số DateTime (mà LINQ   đến   SQL nên làm nếu mô hình cơ sở dữ liệu là chính xác), thì thông tin được gửi từ máy khách đến máy chủ SQL là biểu diễn số SQL của DateTime. Điều này nên tránh bất kỳ vấn đề chuyển đổi datetime giữa khách hàng và máy chủ. Khi bạn xem xét, ví dụ, SQL Profiler, nó không hiển thị cho bạn biểu diễn dạng số của ngày tháng, điều này có ý nghĩa rất ít đối với hầu hết mọi người, nhưng cố gắng hữu ích và hiển thị giá trị dưới dạng một chuỗi.

Điểm quan trọng là nếu SQL hoặc SQL profiler quản lý để hiển thị tham số datetime là 'Nov 4 2011 02:15:25 PM' thì nó biết đó là ngày hợp lệ và nó biết chính xác ngày tháng đó là gì.

Vì vậy, tôi cho rằng vấn đề định dạng hiển thị có thể không liên quan.

Điều đó sau đó để lại câu hỏi là tại sao khách hàng của bạn nhận được thông báo lỗi tràn SqlTypeException - SqlDateTime. Điều đầu tiên cần làm là kiểm tra xem bạn đang thiết lập giá trị ngày nào, cần phải làm gì ở cấp ứng dụng chứ không phải ở máy chủ SQL Server vì nó sẽ không đi xa đến mức nào.(Đây là một lý do khác khiến tôi không nghĩ đây là vấn đề về cấu hình SQL.)

có vẻ như .NET không thể giải thích rằng ngày 4 tháng 11 năm 2011 02:15:25 PM là một DateTime hợp lệ vì một số lý do

tôi không thấy nơi .NET sẽ càng cố gắng để giải thích chuỗi như ngày trừ khi bạn có một số DateTime.Parse lệnh và nếu đúng như vậy, thì vấn đề không có gì để làm với một trong hai LINQ hoặc SQL.

+0

(2) DateTime được thiết lập để một cái gì đó như 'DateTime.Now.AddMinutes (5)' vì vậy tôi khá chắc chắn nó không "ra khỏi phạm vi" –

+0

ông nói rằng NET biến ngày thành một chuỗi đại diện để sử dụng trong cập nhật truy vấn, không phải là SQL biến nó thành một chuỗi. Và, rằng .NET đang phát hành một định dạng khác của chuỗi ngày tháng cho SQL 2005 trong năm 2008 và SQL 2005 không hiểu được truy vấn vì định dạng dường như không phải là một cái gì đó mà nó hiểu được. –

+0

@marc_s Tôi biết điều này là không chắc, nhưng liệu có cơ hội DateTime.Now có thể nằm ngoài phạm vi, nghĩa là ngày máy tính/máy chủ sai không? – sgmoore

Các vấn đề liên quan