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.
Dies scheint ein Problem zu sein, erklärt aber nicht alle Probleme. –