2009-07-09 6 views
14

Làm thế nào tôi có thể nhận được DateTime giá trị trong C# từ hàng, mã hiện đang đem lại cho tôi lỗi bất kỳ sự giúp đỡ được đánh giá cao, dữ liệu được đến từ cơ sở dữ liệu tiến bộ:Lấy một giá trị DateTime từ một DataRow (C#)

foreach (DataRow r in ds.Tables[0].Rows) 
{ 
    string prodCode = r["PRD-CDE"].ToString(); 
    statCode = r["STAT"].ToString(); 
    DateTime firstIssueDate = (DateTime)(r["FISS"]); 
    DateTime endIssueDate = (DateTime)(r["EISS"]); 
    if(endIssueDate > DateTime.Now) 
    { /*do some thing...*/} 
    else {/*user invalid...*/} 
} 

có hai cách sử dụng trong việc chuyển đổi ngày và pars, cảm ơn tất cả các bạn đã giúp đỡ

cuối cùng đoạn mã làm việc:

foreach (DataRow r in ds.Tables[0].Rows) 
      { 
       string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString(); 
       // r.<DateTime?>("FISS"); 
       if (r["FISS"] != DBNull.Value) 
       { 
        DateTime firstIssueDate = Convert.ToDateTime(r["FISS"]); 
        if (r["EISS"] != DBNull.Value) 
        { 
         DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString()); 
         if (endIssueDate > DateTime.Now) 
         { 
+0

Bất kỳ thông báo lỗi mà bạn đang nhận được có thể giúp . – geofflane

+0

Whats kiểu dữ liệu của cột trong tập dữ liệu? Nó là SQL DateTime? –

+0

nó là một cột ngày trong cơ sở dữ liệu tiến độ – Developer

Trả lời

36

Đây chỉ là một phỏng đoán nhưng nếu loại tương ứng trong cơ sở dữ liệu DateTime, bạn có thể kiểm tra nếu cột là nullable?

Nếu vậy bạn có thể muốn thực hiện kiểm tra r["column"] == DBNull.Value và sau đó chuyển nó vào DateTime không thể thực hiện được? Cánh đồng.

Hoặc thậm chí dễ dàng hơn:

row.Field<DateTime?>("column") 

Nếu nó không phải là sau đó yeah, Convert.ToDateTime() hay cái gì khác nên làm điều đó.

EDIT:

tôi thấy mã cuối cùng của bạn có nhưng có bất kỳ cơ hội bạn muốn làm điều này:.

DateTime? firstIssueDate = r.Field<DateTime?>("fiss"); 
DateTime? endIssueDate = r.Field<DateTime?>("eiss"); 

if (firstIssueDate.HasValue && endIssueDate.HasValue) 
{ 
    firstIssueDate.Value // blah blah 
    endIssueDate.Value // blah blah 
} 
+0

nếu (r ["FISS"] == DBNull.Value) điều này đã làm nó có nó là một giá trị null, vẫn đang thử nghiệm :) Cảm ơn bạn – Developer

+0

Tôi thấy mã của bạn và tôi đã thêm một số gợi ý trong 'EDIT' phần. Bạn nghĩ sao? –

+2

Tôi chưa bao giờ thấy phương thức .Field <> được sử dụng .. Đẹp +1 – NotMe

11

Tôi khuyên bạn nên sử dụng DateTime.Parse() nếu hàng trả về một chuỗi cho chỉ mục đó.

string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString(); 
DateTime firstIssueDate = DateTime.Parse(r["FISS"].ToString()); 
DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString()); 

Bạn cũng có thể sử dụng TryParse tùy theo nhu cầu của mình.

+0

Lỗi: Đối số '1': không thể chuyển đổi từ 'đối tượng' thành 'chuỗi' \t sau khi mã hóa mã sau: DateTime firstIssueDate = DateTime.Parse (r ["FISS"]); thậm chí đã thử: DateTime firstIssueDate = DateTime.Parse (r ["FISS"]. ToString()); Lỗi: ex = {"String không được nhận dạng là DateTime hợp lệ."} – Developer

+0

Có cách nào bạn có thể hiển thị cho chúng tôi những gì r ["FISS"]. ToString() trông như thế nào? Có lẽ đó là một loại vô giá trị như ai đó đã đề cập. –

0

Như một câu trả lời phụ, bạn có thể sử dụng chức năng cũng tĩnh Convert.ToDateTime

0

DateTime.Parse (r [ "Fiss"] ToString()) là con đường để đi, nhưng nó ném một lỗi "Chuỗi không được công nhận là một ngày giờ hợp lệ". bạn có thể hiển thị các chuỗi thực tế trong r [ "Fiss"] cột, nó có thể là một vấn đề quốc tế hóa ....

2
foreach (DataRow r in ds.Tables[0].Rows) 
{ 
    string prodCode = r["PRD-CDE"].ToString(); 
    string statCode = r["STAT"].ToString(); 
    DateTime firstIssueDate = DateTime.Parse((r["FISS"]).ToString()); 
    DateTime endIssueDate = DateTime.Parse((r["EISS"]).ToString()); 
    if(endIssueDate > DateTime.Now) 
    { /*do some thing...*/} 
    else {/*user invalid...*/} 
} 

này nên biên dịch và có thể làm việc cho bạn. Mặc dù nó chắc chắn không thực hiện bất kỳ lỗi kiểm tra mà bạn nên làm cho mã sản xuất. Ngoài ra, hãy xem xét DateTime.TryParse và bạn có thể xem xét thêm một IFormatProvider để đảm bảo định dạng được phân tích cú pháp như mong đợi.

0

Nếu bạn có chuỗi DateTime có định dạng đặc biệt (không phải định dạng .NET DateTime chuẩn) cần được chuyển đổi thành loại DateTime .NET, bạn có thể sử dụng phương thức DateTime.ParseExact().

Vui lòng xem MSDN document để biết thêm chi tiết, kể cả các ví dụ.

Nếu bạn có nhiều định dạng để phân tích, thử DateTime.ParseExact Method (String, String[], IFormatProvider, DateTimeStyles)

1

Trước hết, làm r [ "Fiss"]. GetType() và in nó để an ủi (hoặc tạm dừng và nhìn vào nó trong trình gỡ lỗi). Nếu nó nói đó là một String, thì hầu hết các lời khuyên trên sẽ giúp ích. Nếu nó nói điều gì khác, vui lòng quay lại và cập nhật câu hỏi của bạn.

4

Nếu bạn muốn sử dụng một giá trị mặc định (như DateTime.MinValue), chứ không phải là null (? DateTime) hoặc DBNull, bạn có thể làm điều này:

var firstIssueDate = r["FISS"] as DateTime? ?? DateTime.MinValue; 
var endIssueDate = r["EISS"] as DateTime? ?? DateTime.MinValue;