DataTable.Select()方法的一个困惑,或者是一个bug?

本文探讨了在ADO.NET的DataTable类中使用Select()方法进行查询时,查询顺序对结果数量的影响。通过实验验证,展示了逻辑语句中带括号简化表达式的重要性,并分析了可能的原因。

ADO.NET中的组件 DataTable 模拟了数据库中的表,该类提供的 Select() 方法也模拟了SQL语句的部分功能(非全部)。最近,笔者在做一个查询时发现了一个怪异现象,貌似与 Select() 方法的查询顺序或结合顺序有关。见如下代码:

DataTable dt = new DataTable();
dt.Columns.Add("A", typeof(string));
dt.Columns.Add("B", typeof(string));
dt.Rows.Add("6", "0600");

DataRow[] r1 = dt.Select("A = '6' and (B not like '06%' and B not like '02%')");  // 结果行数为0
DataRow[] r2 = dt.Select("A = '6' and (B not like '02%' and B not like '06%')");  // 结果行数为1

针对上述情况,笔者做了如下测试验证:

  • 使用 SQL Server 2008 做了类似表和类似的SQL查询语句做查询,结果行均为0。
  • 去掉 A='6' 的代码,即 dt.Select("(B not like '02%' and B not like '06%')") 等形式,结果行均为0。
  • 条件句带左右括号,即 dt.Select("A = '6' and (B not like '02%') and (B not like '06%')") 等形式,结果行均为0。

上述测试结果令笔者感到困惑,这个现象到底是 DataTable.Select() 的 bug呢还是有没介绍的语法规则或执行顺序?从这个问题也看出来一个基本的编程风格,即逻辑语句中带括号简化表达式是十分有用、有效和正确的。

笔者的测试环境为:Visual Studio 2010、.NET Framework 4.0、Windows7。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值