目前我正在尝试使用此功能导入CSV文件:
public DataSet ImportCommaSeparatedValueFileToDataSet(string SourceFile)
{
var dsImportCSVtoDataSetReturn = new DataSet();
using (var objAdapter1 = new OleDbDataAdapter())
{
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + SourceFile.Substring(0, SourceFile.LastIndexOf(@"\")) + ";Extended Properties='text;HDR=Yes;FMT=Delimited'";
var objConnection = new OleDbConnection(sConnectionString);
objConnection.Open();
var objCmdSelect = new OleDbCommand("SELECT * FROM " + SourceFile, objConnection);
objAdapter1.SelectCommand = objCmdSelect;
objAdapter1.Fill(dsImportCSVtoDataSetReturn);
objConnection.Close();
}
return dsImportCSVtoDataSetReturn;
}
当我尝试导入文件名中没有空格的文件时,它可以正常工作。当我尝试导入以下文件时:
D:\Workspace\WoldCard export.csv
然后我收到以下异常:
excException = {"Syntax error in FROM clause."}
Source = "Microsoft JET Database Engine"
StackTrace " at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)\r\n at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)\r\n at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)\r\n at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)\r\n at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)\r\n at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)\r\n at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)\r\n at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)\r\n at CommonObjects4.clsUtilityOffice.ImportCommaSeparatedValueFileToDataSet(String SourceFile) in D:\\DevProjects\\CommonObjects4\\classes\\clsUtilityOffice.cs:line 262" string
所以很明显问题是在SQL子句中的文件名中有一个空格;但是,当我尝试使用单引号来解决问题时:
var objCmdSelect = new OleDbCommand("SELECT * FROM '" + SourceFile + "'", objConnection);
然后我收到了这个例外:
excException = {"''D:\Workspace\WoldCard export.csv'' is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long."}
另外,当我尝试使用参数时:
var objCmdSelect = new OleDbCommand("SELECT * FROM @SourceFile", objConnection);
objCmdSelect.Parameters.Add("@SourceFile", SqlDbType.NVarChar).Value = SourceFile;
然后我收到了这个例外:
excException = {"Syntax error in query. Incomplete query clause."}
此外,我后来从http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/1c399bf7-a6b3-47bb-8897-d4247b4938f0了解到,表名不能是参数。有没有人有什么建议? TIA。
答案 0 :(得分:4)
感谢您的反馈,DJ KRAZE,它帮助我以不同的方式思考问题。事实证明,如果名称中有空格,我只需在表名周围添加方括号,但它必须只是文件名而不是完整路径:
var objCmdSelect = new OleDbCommand("SELECT * FROM [" + SourceFile.Substring(SourceFile.LastIndexOf(@"\") + 1, SourceFile.Length - SourceFile.LastIndexOf(@"\") - 1) + "]", objConnection);
有关详细信息,请参阅[] brackets in sql statements。
答案 1 :(得分:1)
Roger尝试更改您的连接字符串,看起来像这样
string fileName = SourceFile;
string sConnectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; " + "Extended Properties=\"text;HDR=YES;FMT=TabDelimited;\"", fileName);
表示文件路径和名称D:\ Workspace \ WoldCard export.csv
你可以做两件事之一在文件名中加上UnderScore
D:\Workspace\WoldCard_export.csv
要么
在文件名
@"D:\Workspace\" + "WoldCard export.csv";
另请看Path.Combine Method
当您尝试添加参数时,请使用
Parameters.AddWithValues(@paramname, paramvalue)
方法
答案 2 :(得分:0)
你必须使用[]括号。 带有空格,短划线( - ),保留字等的文件名或表名都不行,可以在方括号中使用它们。
更多信息:请参阅:https://msdn.microsoft.com/en-us/library/ms175874.aspx