我正在执行此代码,我收到错误。
这是在asp脚本中执行的查询。 mydateTime包含date&时间值,所以我使用CAST只获得日期。
SELECT CAST(mydateTime AS DATE) AS getdate FROM vTable
这是代码
var value = (from r in innerdt.AsEnumerable()
where r.Field<string>("ggg") == dt.Rows[i][5].ToString()
select r[0]);
这里的内容是Datatable&amp; dt是另一个数据表。我在 选择r [0]
中收到错误我该如何解决这个问题?
由于
答案 0 :(得分:1)
您的innerdt
表包含DateTime
类型的列,但当您通过r.Field<string>("ggg")
查询时,您希望将其转换为字符串。
这就是问题所在;方法Field
将字段的值强制转换为您指定的类型的值,因此Field
方法看起来像:
public TDest Field<TDest>(this DataRow row, string key)
{
var value = row[key];
return (TDest)value; // Here it throws the InvalidCastException
}
您需要做的是在从行中获取字符串后将DateTime
转换为字符串,如下所示:
var value = (from r in innerdt.AsEnumerable()
where r.Field<DateTime>("ggg").ToString() == dt.Rows[i][5].ToString()
select r[0]);
作为旁注,请记住,这会将日期与毫秒进行比较,这可能不是您想要的。要避免这种情况,请使用格式字符串以确保ToString()
仅返回您想要的部分或使用ToShortDateString()
。
修改强>
正如@sloth建议的那样,更好的方法是将dt.Rows[i][5]
转换为DateTime
,然后使用Date
属性比较对象;此外,您最好将该值存储在变量中,因为您将获得可读性:
var desiredDate = Convert.ToDateTime(td.Rows[i][5]);
var value = (from r in innerdt.AsEnumerable()
where r.Field<DateTime>("ggg").Date == desiredDate.Date
select r[0]);