当DataView.RowFilter设置为不正确的过滤器时,不会抛出预期的异常

时间:2015-12-15 11:15:46

标签: c# .net exception system.data

我使用@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @ContextConfiguration(loader = AnnotationConfigContextLoader.class) public class ControllerTest { @Before public void setup() { MockitoAnnotations.initMocks(this); mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new ControllerExceptionHandler()) .build(); } @Test public void testCase() throws Exception { mockMvc.perform(get("locale?limit=-1")).andExpect(status().isBadRequest()); } 进行表过滤。我有一个带有System.Data.DataView.RowFilter数据类型的“时间”列,对于此列,我使用以下过滤器:

  

时间< = '15 .12.2015 11:38:03.000'

但是我意外地错误地输入了分隔秒和毫秒的点,而是输入了分号:

  

时间< = '15 .12.2015 11:38:03:000'。

我在表格中有一些数据,在第一种情况下,它应该按原样过滤,但第二种情况给出了空的结果。

但是当我试图在项目之外重新创建这个问题时,我发现,第二个案例引发异常!

代码:

DateTime

我已经多次检查并在我的项目中:

  • 不会抛出此异常。
  • 分配后,RowFilter等于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.
  • 继续执行代码,就像使用正确的过滤器表达式时一样。

我认为可能是.Net 4.0错误并将测试应用程序的框架设置为它。 同样的结果:它抛出异常,但在项目中没有异常。

在测试应用中,即使没有调试,也会在发布版本中抛出异常,因此它不依赖于调试器设置。

我已经仔细检查过我在同一个库中使用相同的类。

我在同一台PC上运行我的项目和测试应用程序。

以下是"Time<= '15.12.2015 11:38:03:000'"值设置为错误过滤器后的下一步调试屏幕截图,它接受它无例外: Incorrect filtes is successfuly set.

如果未引发预期的异常,可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

我测试了你的代码,似乎没有测试过滤器,除非数据表中有一行 这段代码可以使用

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'";

但如果在设置过滤器后在数据表中添加一行,则会产生错误,表示您无法将时间与字符串进行比较

 var row = dt.NewRow();
 row["Time"] = DateTime.Parse("14.12.2015 11:38:03.000");
 dt.Rows.Add(row); //this will generate an error

错误“无法执行&#39;&lt; =&#39;在System.DateTime和System.String上操作。“

所以当数据表为空时不执行过滤器

编辑: CodingFeles:为了测试过滤器,table应该在过滤器中使用的列中有一些值