dhRichClient 3 sqlite Unicode

07/05/2012 - 17:47 von Hermie | Report spam
Hallo Olaf,

ich benutze eine sqlite-Datenbank, die ich mit dem dhRichClient3
erstellt habe, in einer anderen Programmiersprache (JAVA), und da kriege
ich es nicht hin, dass der in der DB gespeicherte Unicode-Text richtig
angezeigt/ausgelesen wird.

Jemand in dem Forum hat mich gefragt, wie ich den Text in die
sqlite-Datenbank einfüge.

Ich mache das in VB6 beispielsweise so:
cn.Execute "INSERT INTO mytable (mycol) VALUES ('" & ChrW(847) & "')"

Ich denke, diese Frage zielt aber eher auf die Interna Deiner library ab...
Was kann ich denn da antworten?

Viele Grüße,
Hermann
 

Lesen sie die antworten

#1 Schmidt
07/05/2012 - 19:20 | Warnen spam
Am 07.05.2012 17:47, schrieb Hermie:

ich benutze eine sqlite-Datenbank, die ich mit dem dhRichClient3
erstellt habe, in einer anderen Programmiersprache (JAVA), und da kriege
ich es nicht hin, dass der in der DB gespeicherte Unicode-Text richtig
angezeigt/ausgelesen wird.

Jemand in dem Forum hat mich gefragt, wie ich den Text in die
sqlite-Datenbank einfüge.

Ich mache das in VB6 beispielsweise so:
cn.Execute "INSERT INTO mytable (mycol) VALUES ('" & ChrW(847) & "')"

Ich denke, diese Frage zielt aber eher auf die Interna
Deiner library ab...



Eigentlich nicht...
SQLite speichert Strings (in Text-Feldern) per default als UTF8
(gibt auch noch einen UTF-16-Mode, der wird aber aus Gründen
das DB-Volumen möglichst gering zu halten, meist nicht benutzt).

Mein Wrapper stellt also intern nur sicher, dass die unicode-
fàhigen (V)BStrings beim Einfügen zuvor nach UTF8 konvertiert
werden (per WideCharToMultiByte-API).

Und diese interne UTF8-Konvertierung sollte eigentlich sowohl
über Dein:
cn.Execute "Insert Into ..."
ebenso funktionieren, wie die alternative Einfügevariante
(per Recordset u. UpdateBatch) in dem Beispiel unten auch.

Beim Auslesen sorgt der Wrapper dann genauso für eine
ordentliche Unicode-Rücktransformation in die VBStrings
(per MultiByteToWideChar-API) ... im Code-Beispiel
nachgewiesen per AscW-Value Output.

Was am Ende konkret in Deinem Datenbank-Feld landen muss
(also die UTF8-Zeichen), kannst Du für Dein ChrW(847)
Beispiel hier nachschauen:
http://www.sonderzeichen.de/diakrit...-034F.html

Das Code-Beispiel weiter unten benutzt dann zus. SQLites eingebaute
Hex(...)-Funktion, um den UTF8-Inhalt des Textfeldes alternativ
als HexChar-Content auszugeben...
Und laut der oben soeben verlinkten Seite, muss also für das
16Bit-WChar: 847 - die UTF8-Wandlung zwei UTF8-Chars erzeugen,
mit der Hex-Repràsentation: CD 8F
Und dieser Content befindet sich laut untenstehendem VB-Code
(bzw. der entsprechenden Select-Abfrage), dann auch in dem
entsprechendem Text-Feld der DB (siehe Debug-Output).

Also "an Dir liegts nicht" (bzw. am VB6-Wrapper) - stattdessen muss
man als "Java-Jünger" dann mal schauen, was der konkret verwendete
JDBC-Wrapper hinsichtlich SQLite-Unicode-Transformation von UTF8
nach "Java-StringObject" überhaupt leistet... Könnte auch sein,
dass überhaupt kein "ordentlicher Java-Wrapper" verwendet wird,
sondern direkt das SQLite-API (gegen die sqlite3.dll ... per JNA).
Und das native SQLite-Dll-API gibt halt beim Auslesen von
Textfeldern "nur" die UTF8-ByteChars in korrekter Lànge zurück.
(in dem Falle also Byte-Anzahl 2).


Ok, hier das Beispiel, basierend auf einer InMemory-DB
(die sich hinsichtlich API identisch zu eine FileDB verhàlt)

'zuvor Referenz auf dhRichClient3 oder vbRichClient4 hinzufügen
Private Sub Form_Load()
Dim Cnn As New cConnection, Rs As cRecordset
Cnn.CreateNewDB 'InMemory-DB-Connection erzeugen
Cnn.Execute "Create Table T(ID Integer Primary Key, Txt Text)"

'einfügen des ersten Records per Rs u. UpdateBatch
Set Rs = Cnn.OpenRecordset("Select * From T Where 0")
Rs.AddNew
Rs!Txt.Value = ChrW(847)
Rs.UpdateBatch

'alternativ eingefügter zweiter Record mit demselben Txt-Inhalt
Cnn.Execute "INSERT INTO T(Txt) VALUES ('" & ChrW(847) & "')"

'Ausgabe der zwei Record-Inhalte
Set Rs = Cnn.OpenRecordset("Select *, Hex(Txt) As HexTxt From T")
Debug.Print Rs!ID, AscW(Rs!Txt), Rs!HexTxt
Rs.MoveNext
Debug.Print Rs!ID, AscW(Rs!Txt), Rs!HexTxt
End Sub


Olaf

Ähnliche fragen