【发布时间】: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