我对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”关键字并尝试按此排序。我需要做些什么才能纠正这个问题?
答案 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();