在开发的过程中为了方便,很多时候都用datatable作为离线数据库使用,但是在筛选的时候,对同一列多次筛选时,结果出现了错误。在此记录一下这个坑,希望知道原因的大佬给出答案。
同时,我这里也用其他方法跳过这个坑,基本思路就是,先筛除大于等于5的,然后在得到的结果上继续筛选小于等于15的,更多条件都可以这样筛选下去(这个坑只是在大于小于,或者大于等于和小于等于上面发现,其他筛选条件:比如包含,开头,结尾时用到的like都没这个问题):
用如下数据测试:
筛选目的很简单,想筛选序号在5-15之间的数据,按照正常的筛选的代码为:
sqlStr="(F1_序号>=5) and (F1_序号<=15)";
DataRow[] drs= importData.Select(sqlStr);
得到的结果如下图所示:
根据上面的结果,可以看到筛选出来的结果已经出错了。根据上面的错误,将代码修改为分开分步筛选,得到的结果就正常了,筛选的结果如下:
下面给出错误和正确筛选代码的完整代码:
错误代码,可以看到sql是完整构建之后在进行筛选,这样得到的结果是错误的(主要看查询的地方和代码):
/// <summary>
/// 执行筛选
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void run_Click(object sender, RoutedEventArgs e)
{
string sqlStr = "";
if (valFile.Children.Count > 0)
{
foreach(Label item in valFile.Children)
{
string temStr = "";//构建单个标签内部的sql字符串
OneFilerP filterObj = (OneFilerP)item.Tag;
string filterTxt = filterObj.FilterTxt.Text;
if (filterTxt != "")
{
string filterStr = filterObj.FilterStr;
filterTxt = filterTxt.Replace(';', ';');//考虑中文分号的情况
string[] fts = filterTxt.Split(';');
foreach (string key in fts)
{
if(filterStr == "精确")
{
if(temStr == "")
temStr = "(" + item.Content + "='" + key + "'";
else
temStr += " or " + item.Content + "='" + key + "'";
}
else if (filterStr == "包含")
{
if (temStr == "")
temStr = "(" + item.Content + " like '%" + key + "%'";
else
temStr += " or " + item.Content + " like '%" + key + "%'";
}
else if (filterStr == &