【问题标题】:CSV to DataTable via OleDbDataAdapter - C#通过 OleDbDataAdapter 将 CSV 转换为 DataTable - C#
【发布时间】:2013-11-25 20:29:13
【问题描述】:

我对 C# 有点陌生,而且我的脚已经湿透了。我一直在试图找出我哪里出错了。

我正在尝试做的事情:我想将 CSV 文件导入数据表。我可以通过一个简单的“从文件中选择 *”查询轻松地做到这一点。但是,当我尝试使查询更复杂一点时,我遇到了一个问题。

我或多或少想按非常具体的公式对 DataTable 进行排序。

这是有问题的代码:

        static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
    {
        string header = isFirstRowHeader ? "Yes" : "No";

        string pathOnly = Path.GetDirectoryName(path);
        string fileName = Path.GetFileName(path);

        string sql = @"SELECT name, max_sale_unit_price, max_offer_unit_price, " +
            "( (min_sale_unit_price * 0.85) - max_offer_unit_price ) AS thediff "+
            "FROM [" + fileName + "] " +
            "WHERE (min_sale_unit_price > 0) "+
            "AND ( ((min_sale_unit_price * 0.85) - max_offer_unit_price) > 2000 ) "+
            "ORDER BY thediff DESC";

        using (OleDbConnection connection = new OleDbConnection(
                  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
                  ";Extended Properties=\"Text;HDR=" + header + "\""))
        using (OleDbCommand command = new OleDbCommand(sql, connection))
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
        {
            DataTable dataTable = new DataTable();
            dataTable.Locale = CultureInfo.CurrentCulture;
            adapter.Fill(dataTable);
            return dataTable;
        }
    }

我确实在“adapter.Fill(dataTable)”上遇到异常 --> OleDB 异常:没有为一个或多个必需参数提供值。我有一种感觉,因为我正在使用“AS thediff”关键字并尝试按此排序。我需要做什么来纠正这个问题?

【问题讨论】:

  • 为什么不能使用“select * from file”查询来检索数据。我建议您使用选择查询来获取数据,然后对数据表执行您需要执行的任何业务实现。您可以使用编码较少且简单的 linq,或者您可以循环表的每个数据行并查找数据并实施。
  • 这似乎是一种迂回的方式,不是吗?作为旁注。我已经让上面的代码工作了......通过注释掉“ORDER BY”部分。这确定支持按关键字排序吗?
  • 但这是以对象形式保存数据的最佳方式,如果该数据采用表格结构,那么我们可以轻松枚举并获取每个数据。
  • @RandDesu:看看这个问题(有答案)我不久前发布了 - stackoverflow.com/q/10637918/153923

标签: c# sql csv datatable


【解决方案1】:
   //Sorting the Datatable will return the EnumerableRowCollection<T>

一旦有了数据表,您就可以使用此 LINQ 进行排序:

EnumerableRowCollection<DataRow> dr1 = (from row in dt.AsEnumerable()
                                             orderby row["your_column_name"] descending
                                        select row);

        // Dataview's ToTable returns the table 
        // Note : Don't use Dataview.Table method 

        DataTable dv = dr1.AsDataView().ToTable();

或者你可以这样使用:

  DataTable dtSortedTable =  dt.AsEnumerable()
                            .OrderBy(row =>  row.Field<string>("your_column_name"))            
                            .CopyToDataTable();

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2012-02-03
    • 2020-09-04
    • 2011-11-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多