如何解决 OleDb 错误“FROM 子句中的语法错误”?

Posted

技术标签:

【中文标题】如何解决 OleDb 错误“FROM 子句中的语法错误”?【英文标题】:How do I resolve the OleDb error "Syntax error in FROM clause"? 【发布时间】:2013-01-21 19:10:50 【问题描述】:

目前我正在尝试使用此功能导入 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。

【问题讨论】:

罗杰想一想文件名中的空格是如何工作的 这是D:\Workspace\WoldCard..的路径吗?如果是这样应该是D:\Workspace\WoldCard\export.csv 请澄清罗德.. 路径为 D:\Workspace\WoldCard export.csv。请帮我理解,为什么应该是D:\Workspace\WoldCard\export.csv? 如果路径是D:\Workspace\WoldCard,那么你需要添加一个"\",这样你就会知道路径和文件名..这有意义..所以改变你的代码并添加一个结尾反斜杠“\”看起来像这样D:\Workspace\WoldCard\export.csv 【参考方案1】:

感谢 DJ KRAZE 的反馈,它帮助我以不同的方式思考问题。事实证明,如果表名中有空格,我只需在表名周围添加方括号,尽管它只能是文件名而不是完整路径:

var objCmdSelect = new OleDbCommand("SELECT * FROM [" + SourceFile.Substring(SourceFile.LastIndexOf(@"\") + 1, SourceFile.Length - SourceFile.LastIndexOf(@"\") - 1) + "]", objConnection);

更多详情请见[] brackets in sql statements。

【讨论】:

【参考方案2】:

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

你可以做两件事之一,在文件名中添加一个下划线

D:\Workspace\WoldCard_export.csv 或者 在文件名周围添加双引号

@"D:\Workspace\" + "WoldCard export.csv"; 也看看Path.Combine Method

当您尝试添加参数时,请查看使用

Parameters.AddWithValues(@paramname, paramvalue) 方法也是如此

【讨论】:

是的,我尝试了 AddWithValues 方法,但一直收到与我之前提到的带有参数的错误相同的错误。 Roger 让我们一次处理一个错误。看起来第一个或第二个处理连接字符串,另一个处理 FilePath【参考方案3】:

您必须使用 [] 括号。 带空格、破折号 (-)、保留字等的文件名或表名……是不行的,不能用方括号括起来。

更多信息:见:https://msdn.microsoft.com/en-us/library/ms175874.aspx

【讨论】:

以上是关于如何解决 OleDb 错误“FROM 子句中的语法错误”?的主要内容,如果未能解决你的问题,请参考以下文章

Access 2003 SQL:from 子句中的语法错误

带有 ASP Classic 的 SQL(FROM 子句中的语法错误。)

from 子句中的语法错误,而相同的代码适用于其他表

访问直通外部应用

Microsoft Access 中如何删除多个表的内容?

使用此 INSERT INTO 语句和 .NET OleDb 命名空间时如何解决语法错误?