1

現在、この関数を使用して 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から、テーブル名をパラメーターにすることはできないことを知りました。誰か提案はありますか?ティア。

4

3 に答える 3

7

フィードバックをありがとう、DJ KRAZE、それは私がさまざまな方法で問題について考えるのを助けてくれました。名前にスペースが含まれている場合は、テーブル名の前後に角かっこを追加するだけで済みますが、フルパスではなくファイル名のみである必要があります。

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

詳細については、SQLステートメントの[]括弧を参照してください。

于 2013-01-21T20:27:45.933 に答える
1

ロジャーは、接続文字列を次のように変更してみてください

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を追加する2つのことのいずれかを行うことができます

D:\Workspace\WoldCard_export.csv またはファイル名を二重引用符で囲みます

@"D:\Workspace\" + "WoldCard export.csv";Path.Combine Methodも 見てください

パラメータを追加しようとしているときは、使用して見てください

Parameters.AddWithValues(@paramname, paramvalue)方法も

于 2013-01-21T19:19:13.233 に答える