2010-08-19 36 views
5

tôi có một cột datetime trong máy chủ sql và trường tùy chọn của nó và nếu người dùng quyết định không nhập thì tôi muốn chèn giá trị như NULL trong bảng và tôi định nghĩa như sau:vấn đề datetime với 01/01/1900

@deadlineDate datetime = null 

khi tôi đang chèn vào máy chủ sql i có mã này trong asp.net

private DateTime? GetDeadlineDate() 
{ 
    DateTime? getDeadlineDate = null; 
    if (!string.IsNullOrEmpty(DeadlineDate.SelectedDate)) 
    { 
     getDeadlineDate = DateTime.Parse(DeadlineDate.SelectedDate).Date; 
    } 
    if (!getDeadlineDate.HasValue) 
    { 
     return null; 
    } 
    return getDeadlineDate.Value; 

} 

nhưng vấn đề là: chèn nó

1900-01-01 00:00:00.000 

trong bảng sql thay vì NULL

những gì tôi đang làm sai ở đây?

UPDATE:

private DateTime? GetDeadlineDate() 
{ 
    DateTime? getDeadlineDate = null; 
    if (!string.IsNullOrEmpty(DeadlineDate.SelectedDate)) 
    { 
     getDeadlineDate = DateTime.Parse(DeadlineDate.SelectedDate).Date; 
    } 
    if (!getDeadlineDate.HasValue) 
    { 
     return DBNull.Value; //throws error.... 
    } 
    return getDeadlineDate.Value;   
} 
+0

Nisar, cập nhật của bạn không hoạt động vì 'DBNull.Value' là loại' DBNull', không phải 'DateTime? '. Tôi nghĩ bạn đã bối rối. –

+2

Hãy nhớ rằng, trong khối mã đầu tiên, 5 dòng cuối cùng của phương thức tương đương với 'return getDeadlineDate;'. –

Trả lời

4

Giả sử bạn có:

DateTime? date = GetDate(); 
command.Parameters.Add("@date").Value = date; 

trong trường hợp khi date == null bạn muốn chèn SQL NULL tức DBNull.Value vì vậy bạn nên làm gì tiếp theo:

DateTime? date = GetDate(); 
command.Parameters.Add("@date").Value = (object)date ?? DBNull.Value; 

có nghĩa là giống như:

if(date != null) 
    // use date 
else 
    // use DBNull.Value 

nếu bạn muốn chăm sóc về datetime nullable trong chức năng của bạn, bạn nên khai báo nó cách tiếp theo:

private object GetDate() 
{ 
    DateTime date; 
    return DateTime.TryParse(selectedDate, out date) ? date : DBNull.Value; 
} 

command.Parameters.Add("@date").Value = GetDate(); 

nhưng tôi không khuyên bạn nên làm điều đó và sử dụng tiếp theo:

command.Parameters.Add("@date").Value = (object)GetDate() ?? DBNull.Value; 
+0

Loại biểu thức điều kiện không thể xác định được vì không có chuyển đổi ngầm giữa 'System.DateTime' và 'System.DBNull' nhận lỗi này trong phương thức GetDate(). –

+1

Bạn sẽ cần phải đặt rõ ràng 'DbType' của tham số, sau đó. –

+0

@Nisar: Truyền '(đối tượng)' trên 'DateTime' khi sử dụng toán tử'? 'Hoặc' ?? 'với' DBBull.Value' là 'object' – abatishchev

6

Bạn cần DBNull.Value hơn null khi chèn vào SQL server.

Khi bạn đặt DateTime = null trong .NET, giá trị tối thiểu là DateTime là 01-01-0001.

tôi giả sử bạn đang sử dụng một SMALLDATETIME trong SQL Server trong đó giá trị tối thiểu là '01/01/1900'

+0

Không thể chuyển đổi hoàn toàn loại 'System.DBNull' thành 'System.DateTime?' –

+0

Bạn sẽ phải đăng mã thực hiện 'INSERT', đây là nơi bạn nên sử dụng' DBNULL.Value' –

+0

Chris: tôi đã đăng mã GetDeadlineDate() là phương thức lấy ngày từ hộp văn bản. –

0

Nếu bạn đang gửi truy vấn dưới dạng thông số (của loại chuỗi) đến một phương pháp khác thực thi truy vấn như truy vấn bên dưới:

 int userno = 123; 
     string date_variable = null; 

     string query = string.Format(
        @"INSERT INTO system_log (userno,ref_date) values ({0},'{1}');",userno,date_variable); 

     obj.executeInsert(query,conn); 

Điều này một lần nữa có thể lưu ngày mặc định khi được thực hiện bằng cách sử dụng ExecuteNonQuery() hoặc một cái gì đó khác.

Thậm chí truyền (đối tượng) date_variable ?? DBNull.Value; wont work trong kịch bản này

Sau đó, bạn có thể dễ dàng thiết lập date_variable là "null"

 if (string.IsNullOrEmpty(date_variable)) 
      date_variable= "null"; 
     else 
      date_variable= "'" + date_variable+ "'"; 
     string query = string.Format(
       @"INSERT INTO system_log (userno,ref_date) values ({0},{1});",123,date_variable); 
     obj.executeInsert(query,conn);