【问题标题】:Filtering DateTime Column of DataTable Causes FormatException过滤DataTable的DateTime列导致FormatException
【发布时间】:2014-04-23 00:32:57
【问题描述】:

我有一个DataTable dt 绑定到一个DataGridView。我一直在使用标准查询语法在运行时过滤此网格中的数据。但是,对于此 DataTable 中已知的 DateTime 列,查询

DataRow[] rowArray = dt.Select("DOB >= #01/01/97# AND DOB <= #31/01/97#");

但这会引发带有消息的 FormatException:

字符串未被识别为有效的日期时间。

我已尝试将上述更改为

DataRow[] rowArray = dt.Select("DOB >= #01/01/1997# AND DOB <= #31/01/1997#");

但这给出了同样的错误。从MSDN 看来我过滤正确。我可以确认DataTable 列“DOB”确实是DateTime 类型。

过滤语句有什么问题?

感谢您的宝贵时间。

【问题讨论】:

  • 格式取决于您当前的文化。

标签: c# winforms datatable filtering


【解决方案1】:

只需将两个 DateTime 变量传递到您的 Select 语句中,如下所示:(根据您关于在文本框中输入日期的评论,我还添加了一些数据验证)

DateTime startDate;
DateTime endDate;

var isValidStartDate = DateTime.TryParse(txtStartDate.Text, out startDate);
var isValidEndDate = DateTime.TryParse(txtEndDate.Text, out endDate);

if (isValidStartDate && isValidEndDate)
{
    var rowArray = dt.Select(
        string.Format("DOB >= #{0}# AND DOB <= #{1}#", startDate, endDate));

    // do something with rowArray
}
else
{
    // uh-oh...
}

【讨论】:

  • 是的,但我想通过在运行时输入TextBox 来过滤数据,所以最好我想避免转换,只使用字符串文字......我知道我可以转换并转换回来,但这不是必需的。不过,我可能会尝试一下,看看它是否能解决问题。
  • 我在这里看到了验证的意义,但这肯定不能正常工作。我真的不想在字符串中单独处理日期,而只是将用户指定的选择传递给过滤器。否则我将不得不Regex reg = new Regex(@"#[^#]+#");Trim('#') 等。等等等等。知道为什么基本过滤器仍然不起作用吗?
  • 这太疯狂了。我已经实现了你上面的内容,Select(...) STILL 抛出 FormatException 即使它们被认为是有效的DateTimes!?
  • 疯了,同样的事情。我不知道这里发生了什么软糖。我刚刚写了一个方法来将每个DateTime 列的DateTimeMode 更改为UnspecifedLocalLocal,这也没有帮助。加当。感谢您的时间和帮助。
【解决方案2】:

我唯一能想到的就是语言环境。这似乎您使用 GB 语言环境。试试这个。

CultureInfo myCultureInfo = new CultureInfo("en-gb");
dt.Locale = myCultureInfo;
DataRow[] rowArray = dt.Select("DOB >= #01/01/1997# AND DOB <= #31/01/1997#");

【讨论】:

  • 这没有帮助!?默认情况下,文化实际上是“en-GB”。
  • @Killercam 我通常在过滤器表达式中使用 ' 而不是 #。它总是有效的。你能再试试这个吗? DataRow[] rowArray = dt.Select("DOB >= '01/01/1997' AND DOB
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多