2012-04-02 59 views
31

tôi sẽ khai báo một biến Chuỗi rỗng như thế này:Đặt rỗng DateTime biến

string myString = string.Empty; 

Có tương đương cho biến a 'DateTime'?

Cập nhật:

Vấn đề là tôi sử dụng 'DateTime' làm tham số cho 'StoredProcedure' trong SQL. ví dụ:

DateTime? someDate = null; 
    myCommand.Parameters.AddWithValue("@SurgeryDate", someDate); 

Khi tôi chạy mã này một ngoại lệ được đánh bắt kể cho tôi những 'StoredProcedure' mong đợi một tham số '@SurgeryDate'. Nhưng tôi đã cung cấp. Bất kỳ ý tưởng nào tại sao?

Trả lời

63

Kể từ DateTime là một loại giá trị mà bạn không thể gán null với nó, nhưng chính xác cho những trường hợp này (sự vắng mặt của một giá trị) Nullable<T> đã được giới thiệu - sử dụng một nullable DateTime thay vì:

DateTime? myTime = null; 
+0

Thời gian này có thể phù hợp trong cột Cơ sở dữ liệu SQL thuộc loại D ateTime? Tôi mới làm điều này. – phadaphunk

+1

Có - nếu cột cho phép chèn các giá trị null – BrokenGlass

+0

@PhaDaPhunk Hầu hết các cơ sở dữ liệu sẽ có cài đặt cho dù giá trị có thể được đặt thành không. – Servy

5

Bạn có thể muốn sử dụng một datetime nullable. Datetime? someDate = null;

Bạn có thể tìm thấy trường hợp người sử dụng DateTime.Max hoặc DateTime.Min trong những trường hợp như vậy, nhưng tôi rất nghi ngờ bạn muốn làm điều đó. Nó dẫn đến lỗi với trường hợp cạnh, mã đó là khó khăn hơn để đọc, vv

1

Không có những điều như một ngày trống cho mỗi gia nhập, bạn có nghĩa gì đó như:

DateTime? myDateTime = null; 
20

số Bạn có 2 lựa chọn :

DateTime date = DateTime.MinValue; 

này hoạt động khi bạn cần phải làm điều gì đó mỗi số tiền X của thời gian (vì bạn sẽ luôn luôn được trên MinValue) nhưng thực sự có thể gây ra lỗi tinh tế (ví dụ như sử dụng một số nhà khai thác w/o đầu tiên kiểm tra nếu bạn là không phải MinValue) nếu bạn không quan tâm ul.

Và bạn có thể sử dụng Nullable:

DateTime? date = null; 

Đó là tốt đẹp và tránh được hầu hết các vấn đề trong khi giới thiệu chỉ có 1 hoặc 2.

Nó thực sự phụ thuộc vào những gì bạn đang cố gắng để đạt được.

9

Bạn có thể đặt biến DateTime thành '1/1/0001 00:00:00' nhưng bản thân biến không thể là rỗng. Để sử dụng thời gian sử dụng MinTime này:

DateTime variableName = DateTime.MinValue; 
1

Tùy chọn 1: Sử dụng DateTime có thể vô hiệu?

Lựa chọn 2: Sử dụng DateTime.MinValue

Cá nhân, tôi muốn lựa chọn 1.

3

Một string là một chuỗi ký tự. Vì vậy, nó có ý nghĩa để có một trống rỗng string, mà chỉ là một chuỗi rỗng của các nhân vật.

Nhưng DateTime chỉ là một giá trị duy nhất, do đó không có ý nghĩa khi nói về “trống” DateTime.

Nếu bạn muốn đại diện cho khái niệm "không có giá trị", được biểu thị là null trong .Net. Và nếu bạn muốn sử dụng điều đó với các loại giá trị, bạn cần phải rõ ràng làm cho chúng vô hiệu. Điều đó có nghĩa là sử dụng Nullable<DateTime> hoặc tương đương DateTime?.

DateTime (giống như tất cả các loại giá trị) cũng có một giá trị mặc định , được gán cho các lĩnh vực chưa được khởi tạo và bạn cũng có thể nhận được nó bằng cách new DateTime() hoặc default(DateTime). Nhưng bạn có thể không muốn sử dụng nó, vì nó đại diện cho ngày hợp lệ: 1.1.0001 0:00:00.

5

Phương pháp bạn đã sử dụng (AddWithValue) không chuyển đổi các giá trị null thành giá trị cơ sở dữ liệu. Bạn nên sử dụng DBNull.Value thay vì:

myCommand.Parameters.AddWithValue(
    "@SurgeryDate", 
    someDate == null ? DBNull.Value : (object)someDate 
); 

này sẽ vượt qua giá trị someDate nếu nó không phải là null, hoặc DBNull.Value khác. Trong trường hợp này giá trị chính xác sẽ được chuyển đến cơ sở dữ liệu.

+0

ok Tôi thích phương pháp này nhưng bạn có thể giải thích dòng cuối cùng không ..? – phadaphunk

+0

@PhaDaPhunk: đây là kịch bản tổng quát hơn - bạn có một biến 'someDate' thuộc loại' Nullable '. Nếu giá trị của nó là 'null', tôi chuyển' DBNull.Value' sang phương thức 'AddWithValue'. Nếu không, tôi tự chuyển giá trị. – Alex

+0

Cảm ơn tôi không biết chúng tôi có thể làm điều đó! – phadaphunk

4

Hoặc:

DateTime dt = new DateTime(); 

hoặc

DateTime dt = default(DateTime); 
1

Nếu bạn thiết lập ngày để

DateTime dNewDate = new DateTime(); 

Giá trị được thiết lập để {1/1/0001 00:00:00 AM}

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