【问题标题】:Column name is number, select it with oledb列名是数字,用 oledb 选择它
【发布时间】:2014-06-05 15:24:52
【问题描述】:

类似问题: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... 和列名,当我这样做时,列名是tr110308#csv.01。我尝试选择值然后执行tr110308csv#csv.01,但我无法做到。

同样使用0#000 也没有用...

#62 是我想要的列。

【问题讨论】:

  • 您确定` 是正确的符号吗?不应该是'。我的意思是,您正在尝试选择文字 0.000 作为名为 shipCost 的列,不是吗?
  • 使用' 为您提供文字值。我正在尝试获取名为0.000 的列并将重命名为shipCost,以便在我的数据表中列名将是shipCost。如果你查看下面的代码,你会发现我已经尝试过了。
  • 那么方括号呢? [0.000] as shipCost
  • @PedroC88,他已经在问题文本中尝试了方括号,以及单引号、双引号和反引号。

标签: c# csv oledb


【解决方案1】:

尝试将“select”语句中的列名更改为“0#000”。这是一个尝试重现并解决您的问题的示例。

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

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

形式的选择语句

"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 ...”并检查输出。之前没找到源文件,好有趣的问题!


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

【讨论】:

  • 检查我的更新。我相信您的解决方案有效,但我的专栏名称似乎不是我想的那样。
  • @Brett,在本地,我更新了 CSV 中的列名以匹配您的,并将复制代码更新为 tr110308csv#csv#01 并且能够成功执行。试一试。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多