2009-03-30 7 views
6

Im Rahmen eines Projekts, an dem ich arbeite, in C# muss ich eine .dbf-Datei einlesen. Das erste, was ich tun möchte, ist, die Schematabelle aus der Datei zu holen. Ich habe Code, der funktioniert, solange der Dateiname (ohne die Erweiterung) nicht länger als 8 Zeichen ist.Verwendung der GetOleDbSchemaTable-Methode für eine Langname-DBF-Datei

Zum Beispiel, sagen wir, ich habe eine Datei namens MyLongFilename.dbf. Der folgende Code funktioniert nicht. Es gibt die folgende Ausnahme aus: "Das Microsoft Jet-Datenbankmodul konnte das Objekt 'MyLongFilename' nicht finden. Stellen Sie sicher, dass das Objekt vorhanden ist und Sie buchstabieren seinen Namen und den Pfadnamen richtig.“

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

Vergangenheit diese Ausnahme zu erhalten, ist der nächste Schritt, einen Namen zu verwenden, die OldDbConnection mag (‚MyLongF ~ 1‘statt 'MyLongFilename'), die dazu führt:

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

diese erfolgreich eine OleDbConnection zurückgibt. Um nun die Schematabelle zu erhalten, versuche ich Folgendes:

connection.Open(); 
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, 
    new object[] { null, null, fileNameNoExt, null }); 

Dies gibt eine DataTable ohne Zeilen zurück. Wenn ich den Dateinamen in 8 oder weniger Zeichen umbenenne, funktioniert dieser Code und ich bekomme für jedes Feld in der Datenbank eine Zeile zurück.

Mit dem langen Dateinamen, ich weiß, die zurück Verbindung gültig ist, weil ich es verwenden kann, um ein DataSet zu füllen wie:

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); 

Das gibt mir ein DataSet eine Datatable mit allen Daten enthält, zurück aus Die DBF-Datei.

Die Frage ist also, wie bekomme ich nur die Schematabelle für die lange benannte dbf-Datei? Natürlich kann ich das Problem umgehen, indem ich die Datei umbenenne/kopiere, aber das ist ein Hack, den ich nicht machen möchte. Ich möchte auch nicht das DataSet mit dem Top-1-Datensatz füllen und das Schema aus Spalten ableiten.

Antwort

1

Nun, ich denke, die Verbindung

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

sein sollte, und das andere ist, sollten Sie vielleicht mit anderen Anbieter versuchen, steigerte ich viel zusammen vor, wenn ich wie folgt verwendet:

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

Aber Sie sollten VFP haben 7 installiert

oder install Microsoft OLE DB Provider for Visual FoxPro 9.0 from here

 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); 
0

Ist fileNameNoExt die Version mit dem kurzen Dateinamen? Auch MyLongF ~ 1 ist 9 Zeichen, nicht 8.

2

Nach MSDN, der Ordner stellt die Datenbank und die Dateien repräsentieren Tabellen. Sie sollten dann den Verzeichnispfad verwenden, der den Dateinamen nicht in der Verbindungszeichenfolge und den Namen der Tabelle als Teil der Einschränkungen für GetOleDbSchemaTable enthält.

+0

Dies scheint ein Problem zu sein, erklärt aber nicht alle Probleme. –

0

Wenn Sie eine einzelne (und möglicherweise kleine) dbf-Datei haben, können Sie das Problem lösen, indem Sie die dbf-Datei woanders kopieren und die Kopie anstelle der ursprünglichen Datei öffnen.

0

Ich glaube, dass die DataSource sollte das Verzeichnis, das die .DBF-Dateien enthält. Jeder .Die DBF-Datei entspricht einer Tabelle in diesem Verzeichnis.

ist Meine Vermutung c: \ MyLongF ~ 1 ist ein kurzer Name für ein Verzeichnis, das einen Dateinamen MyLongF ~ 1 # DBF

Können Sie überprüfen, ob dies der Fall entsprechenden enthält ist?