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/diakritische-Zeichen/Unicode-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