微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# DataFilter 找不到列 System.Data.Evaluate.Exception

如何解决C# DataFilter 找不到列 System.Data.Evaluate.Exception

我正在将 Excel 工作表导出到数据表 dt。

然后我有这个用于设置日期格式的代码

CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.DateTimeFormat.ShortDatePattern = "yyyy-MMM-dd";
culture.DateTimeFormat.LongTimePattern = "";
Thread.CurrentThread.CurrentCulture = culture;

我的过滤器字符串如下:

string strFilter = "CONVERT([Creation date],'System.DateTime') <= '2021-02-23' AND CONVERT([Creation date],'System.DateTime') >= '2020-12-01'";

然后我正在执行一个创建过滤数据视图的方法

public DataTable filterDataTable(DataTable dt,string filter) {
                
                DataView dv = new DataView(dt);
                dv.RowFilter = filter;
                DataTable dt2 = dv.ToTable();
                
                return dt2;
                }

执行上述操作后,我收到 System.Data.Evaluate.Exception 类型的异常和消息:“找不到列 [OK]。”结果:-2146232032。

在源 Excel 文件中,我要过滤的列名称是“创建日期”,该列在 Excel 中被识别为常规格式。列中的示例值:2020-12-29 14:05:33、2020-07-03 13:05:19。

如何使用日期条件过滤此数据视图?


编辑 - 解决方

在过滤之前,我创建了一个 DateTime 类型的新列“Creation_date”,并添加了旧列中的解析值。

public DataTable getDtWithDateType(DataTable dt) 
    {
        
        dt.Columns.Add("Creation_date",typeof(DateTime));
        
        foreach(DaTarow row in dt.Rows)
            {
                row["Creation_date"] = DateTime.ParseExact(row["Creation date"].ToString(),"yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture);   
                            }

        return dt;
        }

拥有扩展的 DataTable 后,我就能够实施 Svetoslav Angelov 提出的 Linq 解决方案。

解决方法

这是我使用 Linq 的方式,简单高效


public DataTable FilterDataTable(DataTable dt,DateTime minDate,DateTime maxDate,int columnIndex)
        {
            DataTable output = dt.Clone();
            var filterMenuRows = dt.AsEnumerable().Where(
                r => r.Field<DateTime>(columnIndex) >= minDate
                && r.Field<DateTime>(columnIndex) <= maxDate);
            if (filterMenuRows != null && filterMenuRows.Any())
            {
                output = filterMenuRows.CopyToDataTable();
            }

            return output;
        }

如果你想过滤其他类型的数据列,你应该使用 RowFilter 或 Select ,例如

public DataTable FilterDataTable(DataTable dt,string filter,string columnName)
        {
            DataTable output = dt.Select(columnName +"='" + filter + "'"); 
            
            return output;
        }

假设您在填充 DataTable 时使用迭代:

DataTable dt = new DataTable();
            dt.Columns.Add("NAME",typeof(string));
            dt.Columns.Add("ADDRESS",typeof(string));
            dt.Columns.Add("NOTE",typeof(string));
            dt.Columns.Add("BIRTH_DATE",typeof(DateTime));
            
            //excel is not zero based!!
            int maxExcelRows = 20001;
            int maxExcelColumns = 5;
            DataRow nextRow = dt.NewRow();
            for (int i = 1; i <= maxExcelRows; i++)
            {
                for (int j = 1; j <= maxExcelColumns; j++)
                {
                    //new line
                    if (j == 1)
                    {
                        nextRow = dt.NewRow();
                    }

                    //write the values
                    if (xlRange.Cells[i,j] != null && xlRange.Cells[i,j].Value != null)
                    {
                        if (j == 5) // your DateTime column here
                        {
                            // NOTE: use the exact format of the outer document
                            nextRow[j - 1] = DateTime.ParseExact(xlRange.Cells[i,j].Value.ToString(),"yy/MM/dd HH:mm:ss",CultureInfo.InvariantCulture); ;
                        }
                        else
                        {
                            nextRow[j - 1] = xlRange.Cells[i,j].Value.ToString();
                        }
                    } 
                }
                dt.Rows.Add(nextRow);
            }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?