6

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 レコードを入力して、列からスキーマを推測する必要もありません。

4

5 に答える 5

2

MSDNによると、フォルダーはデータベースを表し、ファイルはテーブルを表します。その場合、接続文字列にファイル名を含まないディレクトリ パスを使用し、GetOleDbSchemaTable の制限の一部としてテーブルの名前を使用する必要があります。

于 2009-06-08T23:34:34.773 に答える
1

まあ、私は接続が必要だと思います

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);

もう1つは、他のプロバイダーで試してみるべきかもしれません.

string cxn = "PROVIDER=VFPOLEDB.1;Data Source=C:\;Extended Properties=dBASE 5.0";

ただし、VFP 7 がインストールされている必要があります。

または、ここから Microsoft OLE DB Provider for Visual FoxPro 9.0 をインストールします。

        const string connectionString = @"Provider = vfpoledb; Data Source = {0}; Collating Sequence = general;";
        OleDbConnection conn = new OleDbConnection(string.Format(connectionString, dirName));
        conn.Open();
        OleDbCommand cmd = new OleDbCommand(string.Format("select * from {0}", fileName), conn);
于 2009-04-14T21:47:17.630 に答える
0

単一の(場合によっては小さい)dbfファイルがある場合は、dbfファイルを別の場所にコピーする問題を解決し、元のファイルの代わりにコピーを開くことができます。

于 2009-06-09T15:15:04.653 に答える
0

fileNameNoExtは短いファイル名のバージョンを保持していますか?また、MyLongF〜1は8文字ではなく9文字です。

于 2009-06-04T04:06:54.273 に答える
0

DataSource は、.DBF ファイルを含むディレクトリを表す必要があると思います。各 .DBF ファイルは、そのディレクトリ内のテーブルに対応しています。

私の推測では、c:\MyLongF~1 は、MyLongF~1#DBF に対応するファイル名を含むディレクトリの短い名前です。

これが事実であるかどうかを確認できますか?

于 2009-06-10T16:31:20.320 に答える