?
Schönen Monatgmorgen Werner
Werner Salomon schrieb:
ja das wäre u.U. auch eine Lösung. Allerdings müssen ein paar Voraussetzungen erfüllt sein. Die erste ist, dass die Darstellung der verwendeten Typen in der DB und im Memory Deiner (!) Implementierung identisch sind.
Das ist gesichert. Ich habe stets eine "bticonst.h" einzubinden, in der diverse
"BTI_????" #definded sind.
Die zweite ist, dass Du die Struktur so definieren musst, dass sie das gleiche 'Package' wie die DB hat. Ich vermute mal aus Deinen Ausführungen, dass das Package der DB 1 hat, also die einzelnen Variablen dicht an dicht im Speicher abgelegt sind.
Ja, genau das ist der Fall, und deswegen bin ich auch schon in die Falle getappt, als ich den Datenbuffer in eine STRUCT ( z.B 60 char 30-Name-.30Vorname) zuwies und nur den Namen haben wollte, auch den Voirnamen mitbekam
Schau einfach mal unter '#pragma pack' in Deiner Hilfe nach.
Das wird prbolematisch zu finden sein, da ich mit g++ unter Linux auf der Konsole ( SSH) arbeite.
Die union- oder auch reinterpret_cast-Lösung ist für kleinere Anwendungen einfacher; die binstream-Lösung ist flexibler und gibt Dir die Möglichkeit auf Abweichungen zwischen DB und Memory zu reagieren.
ICh bin mir noch nicht sicher ( muss es erst versuchen); ob ich mit der union -Lösung überhaupt zurecht komme:
-Die DB-Funktion erwartet die Adressse eines CHAR-Arrays[n] ( i.e. n-char ohne Punkt und Komma hintereinander weg), und leifert die Ergbnisse in selbigen zurück.
- Meine Datensatz-structur möchte ich in eine Struct legen.
STRUCT TableEntry{
Name char[3],
Vorname char[30],
IrgendneInt BTI_INT
}
UNd das Ganze in die Union mit databuffer
union UNION1{
TableEntry myStruct,
std::string dataBuffer
} buffer;
In jeden Fall empfehle ich Dir für jeden TABLE-Typ eine eigene Klasse oder Struct anzulegen, die über Get- und Set-Methoden für die einzelnen Member verfügt und einen Mechanismus, mit der ein Objekt dieses Typs aus der DB gelesen bzw. hinein geschrieben werden kann.
Ich hatte ein ähnliches PRoblem mit Java zu lösen, und habe die c++Lösung ähnlich geplant.:
- Es gibt eine Klasse btrieveClass in der allgemeine Routinen sind,
- pro Datenbank-Tabelle eine abgeleitete "aliasIrgendwas" in welcher hauptsächlich das "Datenhandling" ( das was wir gerade abhandeln) stattfindet. ( und in die ich auch GET und SET functionen packe)
- in "main" erzeuge ich nach Bedarf "ArbeitsKlassen)
aliasIrgendwas hauptIrgendwas;
aliasIrgendwas hilfsIrgendwas;
//....
hauptIrgendwas.Name = "Name";
//..
zu schreiben, als sich mit strcpy inklusiver der notwendigen Überprüfungen der String-Länge herumzuschlagen.
Genau, das macht man nur einmal tief unten im Klassen-Ursprung.
Danke,Werner, für Deine ausführliche Antwort.Das tapezieren wasr doch aufwendiger ( incl Scharnak auf und abbauen). Zur binstream -Lösung bin ich noch nicht gekommen. mache ich aber heute.
Hanns