Laden...

Zugriff auf .DBF Dateien

Erstellt von azetat vor 13 Jahren Letzter Beitrag vor 13 Jahren 7.292 Views
A
azetat Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren
Zugriff auf .DBF Dateien

verwendetes Datenbanksystem: <.DBF mit OleDB bzw. ODBC>

Hallo, das ist mein erster Post, und ich hoffe ich werde nicht gleich gesteinigt, weil ich im falschen Bereich bin oder so.

Für ein berufliches Projekt muss ich mit C# relativ alte .DBF Dateien lesen.
Das klappt mittlerweile mit dem VFPOLEDB Treiber von Microsoft ganz gut. Allerdings scheint dieser nicht für 64-Bit verfügbar zu sein. Da mein Chef aber unbedingt auch Kunden mit neueren Rechnern beliefern will, suche ich nach einer Alternativlösung.

Ich habe auch schon versucht, mit ODBC darauf zuzugreifen, erhalte aber immer folgende Exception:

ERROR [HY000] [Microsoft][ODBC dBase Driver] External table is not in the expected format.

Mit folgendem (aus einem Snippet kopiertem) Code:

                OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
                oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=C:\dbase\;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
                oConn.Open();
                OdbcCommand oCmd = oConn.CreateCommand();
                oCmd.CommandText = selectString;

                dt.Load(oCmd.ExecuteReader());
                oConn.Close();

Die Exception entsteht erst beim Befehl dt.Load();

Ich weiß, es ist irgendwie absurd, auf einem modernen Win7 Rechner DBF Dateien aus den 90ern einzulesen, aber die Dateien werden von einem seeehr alten medizinischen Gerät erzeugt, und das lässt sich leider nicht ändern.

Darum die Frage, ob es einen anderen Treiber gibt, der (auch) unter 64 Bit läuft, oder noch besser eine Lösung ganz ohne Treiber.

Vielen Dank im vorraus!

lg, Robert

J
3.331 Beiträge seit 2006
vor 13 Jahren

Hallo Robert und willkommen,

... oder noch besser eine Lösung ganz ohne Treiber.

Da dBase eine relativ einfache Datenstruktur benutzt, könnte man das Einlesen sogar selbst programmieren. Voraussetzung ist natürlich, dass es sich nicht pro Vorgang um Millionen Daten handelt und sie nur gelesen werden müssen.

In deinem Fall dürfte es sich um eine einzige Tabelle handeln (oder um einige wenige), sodass die Struktur selbst nicht analysiert werden muss, sondern feststeht. Aus der dbf-Version ergibt sich die Größe des Dateikopfs, der überlesen werden kann; aus der Tabellenstruktur ergibt sich die Größe eines Datensatzes, der blockweise eingelesen, aufgeteilt und in einzelnen Datenfeldern (DataTable oder List<T>) registriert werden kann.

Ich kann mir sehr gut vorstellen, dass eine solche Lösung unter CodeProject schon zu finden ist.

Gruß Jürgen

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo,

siehe dazu auch dbf-Datei schreiben.

Nobody is perfect. I'm sad, i'm not nobody 🙁

A
azetat Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren

Danke für die Antworten!

Es ließ sich tatsächlich etwas bei codeproject finden. Ich musst zwar ein paar Kleinigkeiten anpassen, aber jetzt läufts fast ohne Probleme. Und das sogar relativ performant.

Danke noch einmal für die Tipps!

F
10.010 Beiträge seit 2004
vor 13 Jahren

Ein Forum wie dieses Lebt davon, das Fragen kommen und Lösungen dazu gepostet werden.

Wenn du also auch noch die Lösung oder den Link postest hilfst Du weiteren Fragenden.

A
azetat Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren

Ein Forum wie dieses Lebt davon, das Fragen kommen und Lösungen dazu gepostet werden.

Wenn du also auch noch die Lösung oder den Link postest hilfst Du weiteren Fragenden.

Natürlich. Selbstverständlich.

Also mir hat dann der Beispielcode von codeproject sehr geholfen, dieser ist hier zu finden:

http://www.codeproject.com/KB/bugs/LoadDBF.aspx

Allerdings scheint sich das inhaltlich nicht sehr von toms Link zu unterscheiden.

Was ich dann noch geändert habe, ist zusätzlich den Feldtyp 'M' zu implementieren. (für Memo - also im Prinzip strings.) Außerdem musste ich ein paar Kleinigkeiten anpassen, damit Umlaute erkannt werden, oder "," als Komma akzeptiert.
Bei Bedarf kann man sich ja bei mir melden wegen dem Code.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Auch da solltest du dann so nett sein, und dies dem orginalen Autor anzubieten.