Lesen in C# auf einer VFP-DBF (Problem bei verschlüsselte Daten in Char-Felder)

30/10/2008 - 13:41 von Daniel Boss | Report spam
Hallo zusammen

Ich habe eine etwas knifflige Aufgabe, und hoffe ich löst diese und könnt
mir somit helfen :-)

Folgende Situation:
Eine DBF wird mittels einem Programm(VFP9.0 SP2) gepflegt.
In dieser DBF-Datei gibt es Columns im String-Format (C-Typ) welche mit
verschlüsselten Daten gefüllt werden.

Wenn ich via FoxPro diese Felder lese oder schreibe habe ich absolut kein
Problem mit dem Charset, alles entspricht den ASCII-Werten von 0 bis 255;

Nun wollte ich ein C#-Programm erstellen welches diese Daten auch
herauslesen soll. Leider bekomme ich bei diesen verschlüsselten Texten
falsch ASCII-Werte zurückgeliefert.

Beispiel von solch einem verschlüsselten Text : XysÐ3d

Die ASCII-Werte laut Foxpro sind :
88 / 121 / 154 / 208 / 2 / 51 / 100

C# gibt mir folgende Werte :
88 / 121 / 353 / 208 / 2 / 51 / 100

Ihr seht dass das 3te Byte vollkommen über das Ziel hinausschiesst und ich
habe keine Ahnung wieso.

Wenn ich die DBF mit einem ASCII-Editor öffne, finde ich den korrekten
Eintrag :
(Hex) 58 79 9A D0 02 33 64

Woher kommt also diese Fehlinformation von C#?


Meine Abfrage in C# habe ich mittels OleDB und ODBC versucht, bei beiden
Varianten habe ich das falsche Result erhalten.

Die Wandlung mittels Encoding habe ich auch getestet.
Als Unicode-Wert bekomme ich : 88 / 0 / 121 / 0 / 97 / 1 / 208 / 0 / 2 / 0 /
51 / 0 / 100 / 0
Als ASCII-Wert bekomme ich 88 / 121 / 63 / 63 / 2 / 51 / 100

Irgendwie kann ich es drehen und machen wie ich will, ich komme einfach
nicht auf das korrekte Resultat.

Hat jemand eine Idee woran das liegen kann?


Beispiel in C# für das Daten holen mittels OleDB

Klasse xy : DataTable
{
...
OleDbConnectionStringBuilder conBuild = new OleDbConnectionStringBuilder();
conBuild.Provider = "VFPOLEDB.1";
conBuild.DataSource = sPath;
m_sConnection = conBuild.ConnectionString;

m_hDBFConn = new OleDbConnection(m_sConnection);
m_hDBFConn.Open();

m_oDBFAdapter = new OleDbDataAdapter("select * from irgendwas", m_hDBFConn);

this.Clear();

m_oDBFAdapter.Fill(this);
...
}

Irgenwo wird dann diese Klasse gebraucht und das benötigte Feld
herausgelesen mittels
DataRow dr = Rows[m_nCurrentRow];
String xy = (String)dr["feldname"];


Wàre tolle wenn Ihr einen Vorschlag hab was da schiefgehen kann .

Liebe Grüsse
Dani
 

Lesen sie die antworten

#1 Olaf Doschke
30/10/2008 - 13:45 | Warnen spam
Erste Gegenfrage: Ist das Char-Feld der DBF
als binàres Charfeld definiert oder nicht?

Typischerweise sind in VFP-Tabellen ANSI-Texte nach Windows Codepage 1252
codiert. Da C# mit Unicode arbeitet wird auf dem Weg über OleDB oder ODBC
sicher auf der einen oder anderen Seite Konvertierungen.

Ich denke mal, das VFP-Feld auf binàr umzustellen sollte das Problem
eigentlich lösen. Da dort codierte Werte eingetragen sind, wàre dann
die Frage, warum das nicht sowieso schon so ist.

Tschüß, Olaf.

Ähnliche fragen