通过OleDbDataAdapter将CSV转换为DataTable - C#

时间:2013-11-25 20:29:14

标签: c# sql csv datatable

我对C#有点新鲜,并且一直在弄湿我的脚。我一直想弄清楚我在哪里出错了。

我正在尝试做什么:我想将CSV文件导入数据表。我可以通过简单的“select * from file”查询轻松完成。但是,当我尝试使查询更复杂时,我遇到了一个问题。

我或多或少想要通过非常具体的等式对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”关键字并尝试按此排序。我需要做些什么才能纠正这个问题?

1 个答案:

答案 0 :(得分:0)

   //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();