[gelöst] Umlaute bei der Übertragung zwischen Datenbanken via Basic

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

[gelöst] Umlaute bei der Übertragung zwischen Datenbanken via Basic

Beitrag von Hiker »

Hallo,

ich habe mich mit der "direkten" Übernahme aus anderen Datenbanken beschäftigt,
die auch im Base-Handbuch beschrieben ist:
Kapitel 9 Makros Daten von einer Datenbank in eine andere kopieren http://robert.familiegrosskopf.de/lo_hb ... 1187769861
Die Beispieldatenbank findet man hier: http://robert.familiegrosskopf.de/index ... _beispiele als Datenkopie_Quelle_Ziel.zip

Im Unterschied zum Handbuch habe ich mit externen Sqlite3-Datenbanken gearbeitet (und die Kopierrichtung geändert, so daß das Makro aus der Zieldatenbank gesteuert wird). Zu meiner Verwunderung fand ich in der Zieldatei dann eine
Düne
statt der "Düne" in der Quelldatei.
Das Beispiel im Handbuch arbeitet nur mit der internen HSQL-DB und hat diese Probleme nicht.

Quell- und Zieldatei sind als UTF-8 in den erweiterten Einstellungen angemeldet und eine "indirekte" manuelle Kopie via Calc transferiert auch die Umlaute ohne Fehler. Eine Anzeige der gelesenen Quelldaten per MsgBox zeigt die Umlaute korrekt an.

Kennt jemand das Problem schon und weiß, wo man entweder den Zeichensatz nochmal setzen kann, oder eine Konvertierung veranlasst?

Ich vermute, daß die Ursache im Lesen der Daten mit getString

Code: Alles auswählen

stName = oAbfrageergebnis.getString(2) 
und der direkten Verwendung im SQL-String resultiert:

Code: Alles auswählen

stSqlZiel = "INSERT INTO ""Tabelle"" (""ID"",""Name"",""Ort"") VALUES ('"+inID+"','"+stName+"','"+stOrt+"')" 
Es ist aber etwas irritierend, daß die Anzeige in der MsgBox funktioniert, nicht aber die Übergabe als SQl-Kommando.

Taucht das Problem eventuell auch bei anderen Datenbanken auf oder nur bei SQLite3 ?

MFG, Jörn

PS: Getestet unter LO 6.0.4.2 (64Bit) unter Win10; geprüft unter LO 5.3.7.2 unter Win8.1;
SQlite3-ODBC-Treiber 0.9993 Ch.Werner
Zuletzt geändert von Hiker am Mi, 30.05.2018 19:15, insgesamt 1-mal geändert.
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
nikki
******
Beiträge: 787
Registriert: Do, 05.03.2015 10:42

Re: Umlaute bei der Übertragung zwischen Datenbanken via Basic

Beitrag von nikki »

Hallo,

ich würde zunächst den veralteten ODBC-Treiber aktualisieren. Möglicher Weise hat dieser eine Macke. Das Ergebnis kannst Du mit SQLite Studio überprüfen.
Gruß

---------------------------------------------------------
Win.10 Prof. 64-bit, AOO 4.1.7, LO 6.3.4 (x64)
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Umlaute bei der Übertragung zwischen Datenbanken via Basic

Beitrag von Hiker »

Hallo,

den Treiber habe ich am Wochenende aktualisiert, aber - wie fast erwartet - ohne Änderung beim beschriebenen Problem.

Ich halte den Treiber nicht für die Ursache, da er sonst Umlaute korrekt transportiert, z.B. bei Ein und Ausgaben
über Formulare und auch, wenn ich Formularwerte per Makro setze und den Datensatz dann speichere bleiben die
Umlaute erhalten und werden korrekt angezeigt.
Da ich die Daten auch problemlos per LO-Base GUI als Tabelle kopieren, in Calc einfügen und die Calc Tabelle
in die Ziel-Datenbank kopieren (Daten anhängen) kann verdächtige ich eher BASE, daß die SQL-Schnittstelle
entweder eine Konvertierung falsch macht, oder weglässt, was natürlich nicht auffällt, solange man nur SQL-Kommandos
absetzt, die keine Umlaute enthalten...

Ich kann den Datentransfer problemlos ohne Base direkt via SQLite erledigen, da SQLite das ATTACH-Kommando unterstützt,
aber das kann ich nicht einfach an einen Button in der Base-Oberfläche binden.

Ich werde als nächstes wohl probieren, ob ich die Daten direkt per Datenbank-Cursor "sauber" in die Datenbank bekomme,
also ohne Formular und ohne executeQuery

mfg, Jörn

PS: SQLiteStudio nutze ich auch und könnte auch damit ganze Tabellen zwischen Datenbanken kopieren, aber ich
hätte halt gerne eine funktionierende programmierbare Lösung in Base...
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Umlaute bei der Übertragung zwischen Datenbanken via Basic

Beitrag von Hiker »

Hallo,

da ich ja auch noch das Formular offen hatte, auf dem der Button zum Aufruf des Macros ist,
habe ich zur Umgehung des obigen Problems, die Verbindung des Formulars zur Datenbank genutzt
und die Text-Datenfelder über updateString gefüllt. Dabei bleiben alle Umlaute erhalten.

Der folgende Code

Code: Alles auswählen

			oForm1.moveToInsertRow()
			oForm1.updateInt(   1,inID)
			oForm1.updateString(2,stName)
			oForm1.updateString(3,stOrt)
			oForm1.insertRow()
ersetzt also das bisherige

Code: Alles auswählen

stSqlZiel = "INSERT INTO ""Tabelle"" (""ID"",""Name"",""Ort"") VALUES ('"+inID+"','"+stName+"','"+stOrt+"')" stSqlZiel = "IN
oSQL_Anweisung.executeUpdate(stSql)
Das eigentliche Problem der unterschiedlichen Behandlung von Strings bei einerseits Übergabe an SQL-Kommandos, andererseits
Werteintragung per Funktions-/Methodenaufruf bleibt dabei bestehen - und man sollte es im Hinterkopf behalten.
In Python müsste ich den Strings wohl nur ein entsprechendes Encoding mitgeben, aber in Basic kenne ich da keinen
üblichen Weg. Bleibt die Frage, ob das ein Bug ist, oder ich nur die Stelle nicht kenne, an der ich den Zeichensatz auf UTF-8
stellen kann...

Da mein Ziel des Datenübernahme damit erledigt ist, werde ich den Thread als gelöst markieren, auch wenn
das Problem nur umgangen ist.

MfG, Jörn
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
nikki
******
Beiträge: 787
Registriert: Do, 05.03.2015 10:42

Re: [gelöst] Umlaute bei der Übertragung zwischen Datenbanken via Basic

Beitrag von nikki »

Hallo,

vielleicht hilft Dir das Makro_Kochbuch von Thomas Krumbein weiter.
Gruß

---------------------------------------------------------
Win.10 Prof. 64-bit, AOO 4.1.7, LO 6.3.4 (x64)
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: [gelöst] Umlaute bei der Übertragung zwischen Datenbanken via Basic

Beitrag von Hiker »

Hallo,

das Buch habe ich sogar. Es enthält aber fast nichts zum Thema Base (eine Globalsteuerung per Dialog)
und auch das Thema Unicode oder Zeichensätze wird nicht erwähnt.
(Beim csv-Import/Export via Calc wird natürlich der Zeichensatz angegeben, aber das wars.)

Das ü für ü deutet ja eher darauf hin, daß zunächst eine Umsetzung Richtung 2 Unicode-Bytes durchgeführt wird
(übrigens auch wenn ich statt "Düne" explizit "D"+CHR(252)+"ne" verwende), diese dann aber nochmals konvertiert werden,
was dann 2 separate UTF-8-Zeichen à und ¼ erzeugt, die dann von SQLiteStudio oder LibreOffice treulich angezeigt werden.
Die Zeichen bekommt man ja sonst, wenn UTF8-Text unter ISO8859-1 angezigt wird, aber LO und SQLite-Studio
kennen ja UTF8 und zeigen es sonst auch richtig an. (Und die SQLite-Datenbanken sind auf UTF8 eingestellt - Kontrolle: PRAGMA encoding)

mfg, Jörn

PS: Ich werde bei Gelegenheit mal ein Testarchiv nach dem Handbuch-Beispiel zusammensetzen,
falls jemand das Problem bei anderen Datenquellen nachstellen prüfen will.)

PPS: Der Versuch mit CHR(252) zeigt, daß Basic-Strings erstmal nicht als UTF-8 interpretiert werden, sondern an
irgendeiner Stelle konvertiert werden (falls die Konvertierung nicht in CHR() eingebaut ist, aber das dürfte nicht kompatibel
umsetzbar sein...)
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Antworten