2010-02-21 11 views
5

Hey tất cả Tôi đang cố gắng để thực hiện truy vấn chèn sauLỗi: chuyển đổi của một kiểu dữ liệu nvarchar sang một kiểu dữ liệu smalldatetime dẫn đến một giá trị out-of-range

SqlDataSource userQuizDataSource = new SqlDataSource(); 
userQuizDataSource.ConnectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=quizApp;Integrated Security=True"; 
userQuizDataSource.InsertCommand = "INSERT INTO [UserQuiz] ([DateTimeComplete], [Score], [UserName]) VALUES (@DateTimeComplete, @Score, @UserName)"; 

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString()); 
userQuizDataSource.InsertParameters.Add("Score", score.ToString()); 
userQuizDataSource.InsertParameters.Add("UserName", User.Identity.Name); 

int rowsAffected = userQuizDataSource.Insert(); 

buti tục nhận được những điều sau đây lỗi:

The conversion of a nvarchar data type to a smalldatetime data type resulted in an out-of-range value. The statement has been terminated.

Có ai giúp tôi không?

Trả lời

3

Tuyên bố của bạn DateTime.Now.ToString() trả lại là gì ??

Cài đặt ngôn ngữ và khu vực là SQL Server mong đợi của bạn ??

Bạn có sự không khớp không? Có lẽ .NET của bạn trả về định dạng MM/dd/yyyy, trong khi SQL Server mong đợi dd/MM/yyyy (hoặc ngược lại).

Hãy thử mã này trong SQL Server của bạn:

DECLARE @test TABLE (smalldate SMALLDATETIME) 
INSERT INTO @test VALUES ('02/21/2010 22:00:32') -- 
SELECT * FROM @test 

Chuỗi thay thế của tôi ở đó với những gì bạn nhận được từ đầu ra NET của DateTime.Now.ToString() - làm việc này? SQL Server có cung cấp cho bạn thông báo lỗi tốt hơn không?

Tiếp theo, hãy thử sử dụng định dạng ISO-8601 cho ngày (YYYYMMDD) - điều này hoạt động cho TẤT CẢ cài đặt khu vực và ngôn ngữ trong SQL Server - công việc này có hoạt động không ??

DECLARE @test TABLE (smalldate SMALLDATETIME) 
INSERT INTO @test VALUES ('20100221 22:00:32') -- 
SELECT * FROM @test 
+0

cảm ơn rất nhiều ... mà hoạt động !! tôi nghĩ rằng vấn đề là nhiều hơn một thực tế là định dạng của ngày trên máy tính của tôi là khác với của máy chủ !! – c11ada

+0

.net trả về ngày theo định dạng dd/MM/yyyy và khi tôi kiểm tra máy chủ SQL, ngày định dạng là kiểu Mỹ !! – c11ada

+2

Định dạng "ngày giờ" an toàn nhất có thể từ .net đến sql Tôi đã sử dụng cho đến nay là "yyyy-MM-dd HH: mm: ss.fff". PK :-) –

0

Hãy thử thay đổi này:

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString()); 

này:

userQuizDataSource.InsertParameters.Add("@startdate", SqlDbType.DateTime, DateTime.Now.ToString()); 
+0

im nhận 2 lỗi mới ngay bây giờ 1) Kết hợp phương thức quá tải tốt nhất cho 'System.Web.UI.WebControls.ParameterCollection.Add (chuỗi, chuỗi)' có một số đối số không hợp lệ 2) Đối số '2': không thể chuyển đổi từ 'System.DateTime' thành 'string' – c11ada

0

Hãy thử không chuyển đổi ngày của bạn để chuỗi:

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now); 

Edit: Hãy thử điều này thì:

userQuizDataSource.InsertParameters.Add("DateTimeComplete", TypeCode.DateTime, DateTime.Now.ToString()); 

Có một cách khác để vượt qua đối tượng thực tế, nhưng tôi không thể nhớ .. xin lỗi.

+0

im nhận 2 lỗi mới ngay bây giờ 1) Đối sánh phương thức quá tải tốt nhất cho 'System.Web.UI.WebControls.ParameterCollection.Add (chuỗi, chuỗi)' có một số đối số không hợp lệ 2) Đối số '2': không thể chuyển đổi từ 'System.DateTime' thành 'string' – c11ada

+0

Xin lỗi, bạn đã đúng. Có một cách khác để thêm vào chỉ là đối tượng tức là ngày giờ nhưng tôi không thể nhớ, chưa có VS mở tại thời điểm này. Hãy thử nó trên các nguồn dữ liệu thực tế và tìm một phương pháp một cái gì đó như AddParameterValue .. (tên chuỗi, giá trị đối tượng) .. – ziya

1

Tôi đã gặp sự cố tương tự khi thêm datetime.now vào cột máy chủ SQL 'Ngày' được đặt thành kiểu dữ liệu SmallDateTime.

Để giải quyết nó là khá đơn giản (sau nhiều nỗ lực !!)

string currentdatetime= 
DateTime.Now.Year + "." + DateTime.Now.Month + "." + DateTime.Now.Day + 
       " " + DateTime.Now.Hour+(":")+DateTime.Now.Minute+(":")+DateTime.Now.Second 

này sẽ trở lại ngày sang định dạng mà các Server sẽ mong đợi

0

Trong Windows 8, nếu bạn đang phải đối mặt này vấn đề ngay cả sau khi thay đổi Formats ở bên dưới vị trí

Control Panel -> Region

Bạn vẫn phải chuyển các cài đặt này cho người dùng của mình. Trong cùng một cửa sổ, chuyển đến tab "Quản trị", nhấp vào cài đặt sao chép.

Chọn hộp kiểm thích hợp và nhấp vào OK.