Một thời gian trước, tôi đã viết một loạt các phương pháp khuyến nông cho một DataRow để làm chỉ là loại downcasting ... bởi vì tôi ghét viết ổ đĩa lặp đi lặp lại. Cách sử dụng rất đơn giản:
foreach(DataRow dr in someDataTable)
{
DateTime? dt = dr.CastAsDateTimeNullable("lastUpdated") ;
int id = dr.CastAsInt("transactionID") ;
// etc.
}
Đây là phần dành cho giá trị ngày giờ. Việc thêm triển khai cho các loại dữ liệu khác sẽ khá nhỏ. Sẽ không khó để làm điều tương tự như vậy với một DataReader nếu một người bị nghiêng.
Tôi cố gắng để đưa ra phương pháp chung, nhưng những hạn chế trong cách generics được thực hiện xong việc đã gây khó khăn hoặc không thể làm gì và vẫn nhận được hành vi của tôi muốn (ví dụ, null
giá trị chứ không phải là default(T)
— giá trị mặc định nhận cho NULLs SQL điều đó sẽ tạo ra sự khác biệt giữa 0
và null
... khó khăn).
public static class DataRowExtensions
{
#region downcast to DateTime
public static DateTime CastAsDateTime(this DataRow row , int index)
{
return toDateTime(row[index]) ;
}
public static DateTime CastAsDateTime(this DataRow row , string columnName)
{
return toDateTime(row[columnName]) ;
}
public static DateTime? CastAsDateTimeNullable(this DataRow row , int index)
{
return toDateTimeNullable(row[index]);
}
public static DateTime? CastAsDateTimeNullable(this DataRow row , string columnName)
{
return toDateTimeNullable(row[columnName]) ;
}
#region conversion helpers
private static DateTime toDateTime(object o)
{
DateTime value = (DateTime)o;
return value;
}
private static DateTime? toDateTimeNullable(object o)
{
bool hasValue = !(o is DBNull);
DateTime? value = (hasValue ? (DateTime?) o : (DateTime?) null) ;
return value;
}
#endregion
#endregion downcast to DateTime
// ... other implementations elided .. for brevity
}
Nguồn
2012-02-29 17:47:04
Làm thế nào nó không hoạt động? Bạn có ngoại lệ không? – jrummell
Vui lòng không thêm tiền tố vào tiêu đề của bạn bằng thẻ. Có thẻ cho một lý do. – cadrell0