2009-03-30 10 views
6

私がCで作業しているプロジェクトの一部として、.dbfファイルを読み込む必要があります。まず、ファイルからスキーマテーブルを取得します。私は、ファイル名(拡張子なし)が8文字より長くない限り動作するコードを持っています。長い名前のdbfファイルでGetOleDbSchemaTableメソッドを使用する方法

たとえば、MyLongFilename.dbfという名前のファイルがあるとします。次のコードは機能しません。 「Microsoft Jetデータベースエンジンは、オブジェクト 'MyLongFilename'を見つけることができませんでした。オブジェクトが存在することを確認してください、あなたは正しく、その名前とパス名のスペルこと。」

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

は、この例外を乗り越えるためには、次のステップは、代わりのOldDbConnectionが好きな名前( 『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); 

これは私からのすべてのデータとのDataTableを含むDataSetをバック与えますdbfファイル

したがって、長い名前のdbfファイルのスキーマテーブルはどのように取得できますか?もちろん、ファイルの名前を変更したりコピーしたりすることで問題を回避することができますが、それは私が作成したくないハックです。また、上位1レコードでデータセットを塗りつぶしたり、列からスキーマを推定したりすることもできません。私はこのように使用する場合

答えて

1

さて、私は接続が

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

すべきであり、他方は、多分あなたは、他のプロバイダと試みるべきだと思い、私は一緒に前に多くのことを後押し:

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

しかし、あなたはVFP 7が

またはinstall Microsoft OLE DB Provider for Visual FoxPro 9.0 from here

をインストールしている必要があり210
0

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

2

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

+0

これは1つの問題のようですが、すべての問題については説明していません。 –

0

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

0

私は、DataSourceが.DBFファイルを含むディレクトリを表すべきだと考えています。それぞれ。DBFファイルは、そのディレクトリ内のテーブルに対応しています。

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

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

関連する問題