当 DataView.RowFilter 设置为不正确的过滤器时,不会抛出预期的异常
Expected exception is not thrown, when DataView.RowFilter is set to incorrect filter
我使用 System.Data.DataView.RowFilter
进行 table 过滤。我有一个数据类型为 DateTime
的列 "Time",对于此列,我使用以下过滤器:
Time<= '15.12.2015 11:38:03.000'
但是我不小心输错了分隔秒和毫秒的点,而是输入了分号:
Time<= '15.12.2015 11:38:03:000'.
我在 table 中有一些数据,在第一种情况下它被过滤了,但第二种情况给出了空结果。
但是当我试图在项目外重现这个问题时,我发现,第二种情况会抛出异常!
代码:
var dt = new DataTable();
var col = dt.Columns.Add("Time");
col.DataType = typeof(DateTime);
var row = dt.NewRow();
row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
dt.Rows.Add(row);
dt.Rows.Count.Dump();
dt.DefaultView.RowFilter="Time<= '15.12.2015 11:38:03.000'"; // Ok.
dt.DefaultView.RowFilter="Time<= '15.12.2015 11:38:03:000'"; // Evaluation Exception.
我检查了好几次,在我的项目中:
- 没有抛出这个异常。
- RowFilter 在分配后等于
"Time<= '15.12.2015 11:38:03:000'"
。
- 代码执行会像使用正确的过滤器表达式时一样继续执行。
我认为这可能是 .Net 4.0 错误并将我的测试应用程序的框架设置为它。
同样的结果:它抛出异常,但在项目中没有异常。
在测试应用程序中,即使没有调试,在发布版本中也会抛出异常,因此它不依赖于调试器设置。
我仔细检查过我使用的是来自同一个库的相同 类。
我 运行 我的项目和测试应用程序都在同一台电脑上。
这是 RowFilter
值设置为不正确的过滤器后下一步的调试屏幕截图,它无一例外地接受它:
没有引发预期的异常时导致这种情况的原因是什么?
我测试了你的代码,似乎没有测试过滤器,除非数据中有一行table
此代码有效
var dt = new DataTable();
var col = dt.Columns.Add("Time");
col.DataType = typeof(DateTime);
//var row = dt.NewRow();
//row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
//dt.Rows.Add(row);
dt.DefaultView.RowFilter = "Time<= '15.12.2015 11:38:03.000'";
dt.DefaultView.RowFilter = "Time<= '15.12.2015 11:38:03:000'";
但是如果您在设置过滤器后在数据table中添加一行,它将生成一个错误,指出您无法将时间与字符串进行比较
var row = dt.NewRow();
row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
dt.Rows.Add(row); //this will generate an error
错误“无法对 System.DateTime 和 System.String 执行 '<=' 操作。”
所以数据table为空时不执行过滤器
编辑:
CodingFeles :为了测试过滤器,table 应该在过滤器
中使用的列中有一些值
我使用 System.Data.DataView.RowFilter
进行 table 过滤。我有一个数据类型为 DateTime
的列 "Time",对于此列,我使用以下过滤器:
Time<= '15.12.2015 11:38:03.000'
但是我不小心输错了分隔秒和毫秒的点,而是输入了分号:
Time<= '15.12.2015 11:38:03:000'.
我在 table 中有一些数据,在第一种情况下它被过滤了,但第二种情况给出了空结果。
但是当我试图在项目外重现这个问题时,我发现,第二种情况会抛出异常!
代码:
var dt = new DataTable();
var col = dt.Columns.Add("Time");
col.DataType = typeof(DateTime);
var row = dt.NewRow();
row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
dt.Rows.Add(row);
dt.Rows.Count.Dump();
dt.DefaultView.RowFilter="Time<= '15.12.2015 11:38:03.000'"; // Ok.
dt.DefaultView.RowFilter="Time<= '15.12.2015 11:38:03:000'"; // Evaluation Exception.
我检查了好几次,在我的项目中:
- 没有抛出这个异常。
- RowFilter 在分配后等于
"Time<= '15.12.2015 11:38:03:000'"
。 - 代码执行会像使用正确的过滤器表达式时一样继续执行。
我认为这可能是 .Net 4.0 错误并将我的测试应用程序的框架设置为它。 同样的结果:它抛出异常,但在项目中没有异常。
在测试应用程序中,即使没有调试,在发布版本中也会抛出异常,因此它不依赖于调试器设置。
我仔细检查过我使用的是来自同一个库的相同 类。
我 运行 我的项目和测试应用程序都在同一台电脑上。
这是 RowFilter
值设置为不正确的过滤器后下一步的调试屏幕截图,它无一例外地接受它:
没有引发预期的异常时导致这种情况的原因是什么?
我测试了你的代码,似乎没有测试过滤器,除非数据中有一行table
此代码有效
var dt = new DataTable();
var col = dt.Columns.Add("Time");
col.DataType = typeof(DateTime);
//var row = dt.NewRow();
//row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
//dt.Rows.Add(row);
dt.DefaultView.RowFilter = "Time<= '15.12.2015 11:38:03.000'";
dt.DefaultView.RowFilter = "Time<= '15.12.2015 11:38:03:000'";
但是如果您在设置过滤器后在数据table中添加一行,它将生成一个错误,指出您无法将时间与字符串进行比较
var row = dt.NewRow();
row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
dt.Rows.Add(row); //this will generate an error
错误“无法对 System.DateTime 和 System.String 执行 '<=' 操作。”
所以数据table为空时不执行过滤器
编辑: CodingFeles :为了测试过滤器,table 应该在过滤器
中使用的列中有一些值