列名是数字,用oledb选择它

时间:2014-06-05 15:24:53

标签: c# csv oledb

类似的问题:Pass number as a column name in select statement of Sql

我在csv文件中有一个名为0.000的列。如何使用oledb select语句选择它?目前我有:

StringBuilder sbSelectItems = new StringBuilder();
sbSelectItems.Append("location_c, ");
sbSelectItems.Append("impb_, ");
sbSelectItems.Append("order_id, ");
sbSelectItems.Append(" `0.000` as shipCost, ");
sbSelectItems.Append("transmitta, ");
sbSelectItems.Append("piecelb ");

string sSelectStatement = "SELECT " + sbSelectItems.ToString() + " FROM [" + sFileName + "]";

但是我收到''不是有效列的错误。我已经尝试了[0.000]'0.000'"0.000"以及我目前所拥有的内容,并获得了无效列的文字值或错误。该文件是通过我无法访问的程序自动生成的,因此我无法更改列名。


更新

尝试第一个答案中的示例我收到了一个错误No value given for one or more required parameters.所以我很困惑并且做了一个SELECT * FROM...和列名,当我这样做时,列名是{{1 }}。我尝试选择值然后执行tr110308#csv.01,但我无法做到。

同样使用tr110308csv#csv.01无效...

0#000是我想要的列。

enter image description here

1 个答案:

答案 0 :(得分:1)

尝试更改"选择"中的列名称陈述到" 0#000"。这是一个尝试重现然后解决问题的示例。

给定包含以下内容的CSV文件:

Foo,Bar,100.0,200
Alpha,Happy,8,5
Beta,Sad,19,2

表单的Select语句

"Select Foo, `100.0` From "

使用消息...

接收 OleDbException
  

''不是有效的名称。确保它不包含无效字符或标点符号,并且不会太长。

..它匹配您收到的错误(或者,我认为它,您缩写并更改了消息)。

将选择更改为" 100#0"能够回避这个问题。

完整的代码:

string fileName = "C:\\Temp\\test.csv";
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"TEXT;HDR=YES;FMT=Delimited\";",    Path.GetDirectoryName(fileName));

using (var connection = new System.Data.OleDb.OleDbConnection(connectionString)) 
{
    string sql = "Select Foo, `100#0` From " + Path.GetFileName(fileName);
    using (var adapter = new System.Data.OleDb.OleDbDataAdapter(sql, connection)) 
    {
        var table = new DataTable();
        var result = adapter.Fill(table);
        table.Dump(); // LinqPad method to display result for verification
    }
}

您会注意到输出中的列名与select语句匹配(尽管您可能仍然使用别名,因为您的原始SQL会尝试这样做)。实际上,这里的发现方法是简单地执行一个" Select * From ..."并检查输出。我事先没有找到任何原始材料,这是一个有趣的问题!

DataTable output


修改:对于您的更新,同样的方法也适用。名称" tr110308csv#csv.01"对于select语句不合法,但名称为" tr110308csv#csv#01"是。重命名测试文件中的列(以匹配您的列),然后在代码中使用更改的版本生成所需的输出,我建议您也在代码中尝试它。