C# で取り組んでいるプロジェクトの一環として、.dbf ファイルを読み込む必要があります。最初に、ファイルからスキーマ テーブルを取得します。ファイル名 (拡張子なし) が 8 文字を超えない限り機能するコードがあります。
たとえば、MyLongFilename.dbf という名前のファイルがあるとします。次のコードは機能しません。次の例外がスローされます。オブジェクトが存在すること、およびその名前とパス名のつづりが正しいことを確認してください。」</p>
string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);
この例外を回避するための次のステップは、OldDbConnection が好む名前 (「MyLongFilename」ではなく「MyLongF~1」) を使用することです。これにより、次のようになります。
string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);
これにより、OleDbConnection が正常に返されます。スキーマテーブルを取得するために、次のことを試します。
connection.Open();
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
new object[] { null, null, fileNameNoExt, null });
これは、行のない DataTable を返します。ファイル名の名前を 8 文字以下に変更すると、このコードが機能し、データベース内の各フィールドの行が返されます。
長いファイル名を使用すると、次のように DataSet を埋めるために使用できるため、返された接続が有効であることがわかります。
string selectQuery = "SELECT * FROM [MyLongF~1#DBF];";
OleDbCommand command = new OleDbCommand(selectQuery, connection);
connection.Open();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = command;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
これにより、dbf ファイルのすべてのデータを含む DataTable を含む DataSet が返されます。
問題は、長い名前の dbf ファイルのスキーマ テーブルだけを取得するにはどうすればよいかということです。もちろん、ファイルの名前を変更/コピーすることで問題を回避できますが、それは私がしたくないハックです。また、DataSet に上位 1 レコードを入力して、列からスキーマを推測する必要もありません。