我打電話給shenanigans,聲稱該列是存儲作爲DateTime
。我敢打賭你實際上在該列中存儲了日期的字符串表示。
爲了演示,下面是一個簡單的例子,你會得到什麼例外(如果有的話)。
var dt = new DataTable();
dt.Columns.Add("AsString", typeof(string));
dt.Columns.Add("AsDateTime", typeof(DateTime));
var now = DateTime.Now;
var row = dt.Rows.Add(now.ToString(), now);
row.Field<string>("AsString"); // this is fine
row.Field<string>("AsDateTime"); // InvalidCastException: Unable to cast object of type 'System.DateTime' to type 'System.String'.
row.Field<DateTime>("AsString"); // InvalidCastException: Specified cast is not valid.
row.Field<DateTime>("AsDateTime"); // this is fine
DateTime.Parse(row.Field<string>("AsString")); // this is fine
所以你應該能夠看到,當試圖讀取是存儲爲string
場,而您嘗試訪問它作爲一個DateTime
,它將引發你剛纔所描述的消息異常。
有兩種方法可以解決它。
我會推薦的是改變你的列的類型,因此它是DateTime
對象,實際存儲DateTime
值。不,字符串表示不起作用。然後,您的查詢將按照您預期的方式工作,而無需進行其他更改。
否則,請更改您的查詢,以便使用正確的類型(a string
)訪問該字段,將其解析爲DateTime
對象,然後從該處繼續。
var now = DateTime.Now;
var query =
from row in dt.AsEnumerable()
let startDate = DateTime.Parse(row.Field<string>("StartDate"))
where SqlMethods.DateDiffDay(
TimeZone.CurrentTimeZone.ToLocalTime(startDate),
now) >= 0
select row;
該字段實際存儲爲DateTime對象還是字符串?在我看來,這是一個字符串。 – 2012-07-05 14:12:18
這是一種DateTime。 – Pradeep 2012-07-05 14:14:14
不要投,解析 – Jodrell 2012-07-05 14:14:51