C# 中datatable的select对同一列用大小或小于筛选时,有一些坑

在开发的过程中为了方便,很多时候都用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 == &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值