类似的问题: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
是我想要的列。
答案 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 ..."并检查输出。我事先没有找到任何原始材料,这是一个有趣的问题!
修改:对于您的更新,同样的方法也适用。名称" tr110308csv#csv.01"对于select语句不合法,但名称为" tr110308csv#csv#01"是。重命名测试文件中的列(以匹配您的列),然后在代码中使用更改的版本生成所需的输出,我建议您也在代码中尝试它。