2009-02-26 16 views
6

Tôi đang đọc kết quả từ Cơ sở dữ liệu MS SQL 2008 với một kiểu cột của dbtype.time từ một bộ dữ liệu, sử dụng C# với khung công tác DAAB 4.0.Làm thế nào để chuyển đổi Datareader Kết quả của DbType.Time để Timespan Object?

Vấn đề của tôi là tài liệu MSDN nói dbtype.time nên ánh xạ tới một khoảng thời gian nhưng chỉ có hàm khởi tạo gần cho thời gian tôi thấy chấp nhận một thời gian dài và kết quả được trả về từ trình quản lý dữ liệu không thể truyền sang thời gian dài. timespan.

Tôi tìm thấy điều này Article whichs hiển thị phương thức datareader.getTimeSpan(), nhưng trình quản lý dữ liệu trong daab 4.0 dường như không có phương pháp này.

Vậy làm cách nào để chuyển đổi kết quả từ bộ dữ liệu sang đối tượng timepan?

Trả lời

6

GetTimeSpan là phương thức OleDbDataReaderSqlDataReader (nhưng không thuộc giao diện IDataReader chung hơn mà DAAB trả về ExecuteReader). Tôi giả định rằng phiên bản IDataReader mà DAAB đã trả lại cho bạn thực sự là một phiên bản của SqlDataReader. Điều này cho phép bạn truy cập vào các phương pháp GetTimeSpan bằng cách đúc các IDataReader dụ một cách phù hợp:

using (IDataReader dr = db.ExecuteReader(command)) 
{ 
    /* ... your code ... */ 
    if (dr is SqlDataReader) 
    { 
     TimeSpan myTimeSpan = ((SqlDataReader)dr).GetTimeSpan(columnIndex) 
    } 
    else 
    { 
     throw new Exception("The DataReader is not a SqlDataReader") 
    } 
    /* ... your code ... */ 
} 

Edit: Nếu trường hợp IDataReader không phải là một SqlDataReader sau đó bạn có thể thiếu provider thuộc tính của chuỗi kết nối của bạn được định nghĩa trong app.config của bạn (hoặc web.config).

0

Loại .NET của giá trị cột là gì? Nếu đó là một DateTime thì bạn có thể chuyển giá trị của thuộc tính Ticks (dài) tới hàm tạo TimeSpan. Ví dụ.

var span = new TimeSpan(colValue.Ticks); 
9

Bạn đã thử dàn diễn viên trực tiếp như thế này chưa?

TimeSpan span = (TimeSpan)reader["timeField"]; 

Tôi vừa thử nghiệm điều này một cách nhanh chóng trên máy của mình và hoạt động tốt khi "timeField" là kiểu dữ liệu Thời gian trong cơ sở dữ liệu (SQL).

+0

Cả giải pháp của bạn và Ken đều tốt. Tuy nhiên, nếu giá trị là null, thông báo ngoại lệ của giải pháp của Ken là mô tả hơn. 'SqlNullValueException - Dữ liệu là Null. Không thể gọi phương thức hoặc thuộc tính này trên các giá trị Null' VS 'InvalidCastException - Truyền được chỉ định không hợp lệ'. – TheWanderingMind

+1

Để trả lời BishopBarber bình luận nếu cột có thể được nullable bạn nên chuyển đổi nó để TimeSpan? nullable loại và kiểm tra null. 'TimeSpan? span = reader ["tsfield"] == DBNull.Value? (TimeSpan?) Null: (TimeSpan?) Đọc ["tsfield"] ' –

+0

Tôi thấy giải pháp này tốt hơn vì tôi thường không truy cập trình đọc dữ liệu của mình theo chỉ mục. Tuy nhiên tôi có một phương pháp trung gian để kiểm tra null. – MichaelChan

1

Dưới đây là quan điểm của tôi:


using (IDataReader reader = db.ExecuteReader(command)) 
{ 
    var timeSpan = reader.GetDateTime(index).TimeOfDay; 
} 

Cleaner, có lẽ!

+0

Lớp cơ sở dữ liệu ném một 'InvalidCastException' cho tôi khi nó trả về một kiểu' TIME' nhưng tôi cố đọc với 'GetDateTime()'. – binki