Seite 1 von 2

Umlautmurks II: SQLite als Übeltäterin bzw. ?*belt?*terin

Verfasst: 02.10.2008 10:51
von Palandt
Hallo Leute, ich hoffe, es ist bald das letzte Mal, dass ich euch mit Fragen bombardiere, aber wie gesagt, no good handbook, no real help...:)
Also zur Sache: Ich habe mittlerweile das Problem identifiziert, dass ich vor kurzem noch dem Listviewgadget anlastete: SQLite stellt keine "german Umlauts" dar. Ich habe mithin keinen Fehler bei der Konvertierung gemacht, sondern SQLite stellt die Umlaute und das "ß" allesamt als "?" dar. Meine in Rede stehende Datenbank ist auch schon auf UTF-8 eingestellt. Auch der Vorschlag von TS-Soft, den Befehl "SText = PeekS(@SText, -1, #PB_UTF8)" zu verwenden, um die Variable SText zu "konvertieren", nachdem sie den Inhalt des jeweiligen Datensatzes zugewiesen bekommen hat, hilft leider nicht weiter, da die Datenbank ja bereits das richtige Format hat. Auch die Umstellung des Compilerflags nutzt in diesem Fall nichts. Auch meine Idee, den Umlautmurks in der CSV per "Strg + F" zu ersetzen, ist hinfällig, da die Umlaute in der CSV-Datei noch korrekt gespeichert sind.

Meine Ansätze zur Lösung des Problems waren bzw. sind folgende:
1. Ich schreibe eine Prozedur, die mittles "FindString" und "ReplaceString" den von SQLite verursachten Umlautmurks bei Einlesen der Datensätze "zurückkonvertiert"; Problem: SQLite speichert jeden Umlaut unter dem selben Ersatzzeichen "? + noch irgendson Mistakronym" ab, eine Rückkonvertierung ist mithin - mangels eindeutiger Zurordnung - nicht möglich.

2. Ich schreibe eine Prozedur, die diese Konvertierung in der CSV-Datei vornimmt und "äöüß " in für SQLite lesbare Zeichen umwandelt und anschließend muss ich im Programm selbst - spiegelbildlich - dazu, eine Rückkonvertierungsprozedur schreiben. Mittlerweile bin ich soweit, dass ich das hinkriegen werde, da ich String-Konvertierungen bei VB hundertmal gemacht hab und diese sich bei PB so gut wie gar nicht von denen in VB unterscheiden.

Ich habe aber ehrlich gesagt, keine Lust, einen solchen Aufwand zu betreiben, der zudem noch die Fehleranfälligkeit des Progs erhöht, da mit jeder Umwandlungsroutine auch eine Fehlerquelle mehr entsteht.

Fällt euch, der ihr mir oftmals geniale Tipps gegeben habt und geholfen habt vor lauter Wald auch mal wieder die Bäume zu sehen, eine bequemere Lösung ein?

Wenn nicht, dann reicht's mir langsam mit dem Aufwand, den ich zur Konvertierung meiner Datenbank von Access in SQLite betreiben muss, ich werd das Thema dann endgültig abhaken und erst, wenn ein "vollautomatisches" Konvertierungsprogramm zur Verfügung steht, mal wieder an SQLite denken. Ich wollte ja auch erst mit meiner Probedatenbank (§ Tabellen) und dem Umlautmurks weitermachen, aber mittlerweile bin ich mit dem Rohgerüst meines User-Interfaces, nicht zuletzt dank eurer Hilfe, fast fertig und ich kann diese verfluchten ? + Hieroglyphen einfach nicht mehr lesen, da werd ich wahnsinnig.

Danke im Voraus!

Re: Umlautmurks II: SQLite als Übeltäterin bzw. ?*belt?*teri

Verfasst: 02.10.2008 11:42
von Kiffi

Verfasst: 02.10.2008 11:46
von Palandt
Achwas, damit löse ich bzw. du :) auch gleich noch mein Umlautproblem?

Werde ich gleich mal teste, vielen dank nochmals, wusste gar nicht, was sich so für "Schmankerl" in deinem Code verbergen können...:)

Meld mich dann nach nem Testdurchlauf...dann erst gibts den Ritterschlag...:)

Verfasst: 02.10.2008 12:11
von Palandt
Hi Kiffi, ich habs mit 3 Tabellen aus meiner richtigen Datenbank versucht, leider hab ichs nicht hingekriegt. Das Prog meldete mir zwar keinen Fehler, schloss aber mit dem Debug-Kommentar "MDB!" ab, ohne dass eine neue Datenbank erstellt wurde.

Hier das von mir modifizierte Code-Segment:

Code: Alles auswählen


Define MDB_ODBC.s  = "K:\VB-Programme\PURE BASIC\QM\Database\QM2.mdb" ; Hier trägst Du Deine ODBC-Verbindung ein = Datenbank
Define SQLite_DB.s = "K:\VB-Programme\PURE BASIC\QM\Database\QM2.sqlite" ; Hier trägst Du ein, wo die SQLite-Datenbank erstellt werden soll

NewList Tabellenname.s()

; Nun trägst Du in der LinkedList die Namen der zu exportierenden Tabellen ein:
AddElement(Tabellenname()) : Tabellenname() = "Schadensrecht"
AddElement(Tabellenname()) : Tabellenname() = "SR_Anwartschaftsrecht"
AddElement(Tabellenname()) : Tabellenname() = "VerwProzR7_Normenkontrolle"
; [...] und so weiter und so fort
Was mach ich falsch?

Verfasst: 02.10.2008 12:18
von Kiffi
Palandt hat geschrieben:Was mach ich falsch?
in MDB_ODBC wird der Name Deiner ODBC-Verbindung eingetragen und
nicht der komplette Datei-Pfad

also

Code: Alles auswählen

Start / Einstellungen / Systemsteuerung / Verwaltung / Datenquellen (ODBC)
aufrufen und in dem nun erscheinenden Dialog eine Benutzer-DSN eintragen.

Grüße ... Kiffi

Verfasst: 02.10.2008 12:20
von Palandt
Was bitte ist das denn? Das hab ich noch nie gebraucht ???? :shock:

//EDIT: Ich hab das Menu grad mal aufgemacht, mein lieber Scholli, da werden ja die übelsten Sachen abgefragt, das Vokabular, das dort verwendet wird, ruft bei mir Erinnerungen an einen chinesischen Olympiakommentator hervor, der einmal versehentlich ohne Übersetzung Eingang in irgendeine deutsche Olympiaübertragung gefunden hat...da verstell ich lieber nichts....*bibber - angst vor absturz*....

Verfasst: 02.10.2008 12:39
von Kiffi
Palandt hat geschrieben:Was bitte ist das denn?
http://de.wikipedia.org/wiki/ODBC
Palandt hat geschrieben:Das hab ich noch nie gebraucht ???? :shock:
ich nehme mal an, dass Du über ADO (oder DAO) Deine MDB mit VB
konnektiert hast. Geht auch unter PureBasic, doch dafür würdest Du die
Vollversion benötigen; in der Demo-Version sind API-Aufrufe nicht erlaubt.
Palandt hat geschrieben:da verstell ich lieber nichts
Du brauchst da nix zu verstellen. Du musst lediglich eine ODBC-Verbindung hinzufügen.

Also:

* Benutzer-DSN
* Button 'Hinzufügen...'
* "Microsoft Access Driver (mdb)" auswählen
* In Datenquellenname QM2 eintragen
* Button 'Auswählen...'
* Im nun erscheinenden Fileselektor Deine MDB lokalisieren
* OK drücken
* Fertig

im Code sieht das dann so aus:

Code: Alles auswählen

[...]
Define MDB_ODBC.s  = "QM2" ; Hier trägst Du Deine ODBC-Verbindung ein
[...]

Grüße ... Kiffi

Verfasst: 02.10.2008 12:50
von Palandt
Ab heute nur noch GROßVESIR PROF. DR. rer. nat. DR. phil. GRAF VON KIFFI !!!!!!!!

Tausend Dank, es hat geklappt, sogar die Umlaute sind weg! Du hast es echt drauf, Muchacho!

PS: Ich hab seit gestern die Vollversion (Monatserster, muss diesen Monat jetzt 4 Kisten Bier weniger trinken, wird knallhart! :) ). Wenn ich Prof. Dr. Dr. Kiffi dann noch darum bitten dürfte, mir zu sagen, wie ich es - denk dran Vollversion - hinkriege, dass ich diese Umstellerei in Windows meinen Usern ersparen kann? Der Tanklaster mit dem Jahresvorrat Dom Perignon ist übrigens schon zu dir unterwegs....

//EDIT: Aber das blöde ListViewGadget zeigt die Umlaute immer noch nicht richtig an, obwohl sie jetzt in der DB richtig gespeichert sind, aber immerhin zeigt es pro Umlaut ein eigenes Zeichen an, dann kann ich ja meinen eingangs erwähnten Punkt 1- Vorschlag verwirklichen, das ist dann nicht mehr so aufwendig.

//EDIT2: Problem mit dem ListviewGadget mit TS-Soft's Trick gelöst:
SText = PeekS(@SText, -1, #PB_UTF8)#
Jetzt passt alles, Hurra!

Verfasst: 02.10.2008 13:08
von Kiffi
Palandt hat geschrieben:Wenn ich Prof. Dr. Dr. Kiffi dann noch darum bitten dürfte, mir zu sagen, wie ich es - denk dran Vollversion - hinkriege, dass ich diese Umstellerei in Windows meinen Usern ersparen kann?
die Einrichtung einer ODBC-Schnittstelle benötigst Du ja nur auf Deinem
Rechner zwecks Konvertierung MDB -> SQLite.

Dein User bekommen also Deine Programmversion, die auf die SQLite-DB
zugreift und die kann (wie Du im Code oben gut sehen kannst) mit einer
Pfadangabe konnektiert werden. Also Anwenderrechner: nix ODBC :-)
Palandt hat geschrieben:Der Tanklaster mit dem Jahresvorrat Dom Perignon ist übrigens schon zu dir unterwegs....
Budweiser Budvar wäre mir lieber ;-)

Grüße ... Kiffi

Verfasst: 02.10.2008 13:13
von Kaeru Gaman
<offtopic>
Kiffi hat geschrieben:ich nehme mal an, dass Du über ADO (oder DAO) Deine MDB mit VB
konnektiert hast.
wie jetzt... die Datengbank mit der Goldkante? ... oder Dead On Arrival...

@Palandt
gibts von deinem Ava ne große version im Netz?
mich würde mal interessieren, was da drunter steht...
</offtopic>