ファイルのパス/名前にスペースがある場合に、System.Data.Odbc.OdbcConnection を使用して DBF ファイルをクエリする
-
01-10-2019 - |
質問
System.Data.Odbc.OdbcConnection を使用して DBF ファイルをクエリしようとしています。ファイルにスペースが含まれていない場合は正しく動作しますが、「DBF ファイルを開くときにエラーが発生しました:」というエラーが表示されます。ファイル パスまたは名前にスペースが含まれている場合、エラー [42000][Microsoft][ODBC dBase Driver]FROM 句の構文エラーが発生します。
次のコードを使用しています。
oConn = 新しい System.Data.Odbc.OdbcConnection();oConn.ConnectionString = "Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=NA;Exclusive=No;Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
oCmd.CommandText = "SELECT * FROM C: est 2\12345678.dbf";
コマンド テキストはハードコーディングされていません。簡単にするためにそのように含めただけです。このアプリケーションは、ユーザーが DBF ファイルを選択して表示できるように設定されています。ユーザーが DBF ファイルを保存する場所を制御することはできません。むしろ、ファイル名/パスにスペースを入れないようユーザーに覚えてもらう必要はありません。
ファイル名/パス内のスペースをエスケープするにはどうすればよいですか?
解決
おそらく「MS-DOS 8.3 ファイル名形式」に関連した問題だと思われます。次のリンクを確認できます。
- マイクロソフトサポート:dBASE、FoxPro、または Paradox ファイルをインポートするときにエラー メッセージが表示される
- ウィキペディア:8.3 ファイル名 (ここでは、スペースは慣例により禁止されていると書かれています)
他のヒント
私もこの問題に遭遇していました。これは Google で私のヒットナンバー 1 だったので、あまり期待していませんでした。ただし、現在のディレクトリを問題のあるディレクトリに変更し、CommandText 内のパスを除外することで、コードを機能させることができました。
//Save the current directory
string currentDir = System.IO.Directory.GetCurrentDirectory();
//Select the path that we need to use
System.IO.Directory.SetCurrentDirectory("C:\\test 2\\");
//Now the path isn't required:
oCmd.CommandText = @"SELECT * FROM 12345678.dbf";
//Restore the old directory
System.IO.Directory.SetCurrentDirectory(currentDir);
ファイル名にできることはまだ制限されています (スペースは使用できず、8 文字以下であると思います) が、それは私が作業できるものです。