Hallo Zusammen
Vielleicht hat hier noch jemand eine Idee.
Ich schreibe mit einem kleinen vb.net Tool Daten in einen Firebird DB.
Wenn ich Daten in ein Textfeld schreibe, alles ok. Wenn ich Daten in ein Blob Feld schreibe, gehen die Umlaute verloren.
Das Feld in der DB ist ein Blob sub_type binary.
Die CodePage der DB ist WIN1252.
Ich öffne die DB mit folgendem Connectionstring: Database=C:\MAND7.FDB;User=SYSDBA;Password=*****;Port=3050;Server=10.255.200.11
Setze dann per ExecuteNonQuery ein einfaches Update ab
Using cmd As New FbCommand(SQL, conConnection)
cmd.CreateParameter.Charset = FbCharset.Windows1252
cmd.ExecuteNonQuery()
End Using
Die Umlaute nicht übertragen.
Nehme ich die gleiche SQL Anweisung und führe diese im DBeaver durch, geht es.
Die Parameter der Verbindungen habe ich geprüft und sind gleich.
Vielleicht hat noch jemand einen Tip für mich.
Gruß Andre
vb.net: Daten in blob schreiben
Moderator: thorben.braun
Per Subtype Binary musst du ein Byte[]-Array übergeben.
Einen String kannst du dann mit den Konverterklassen System.Text String in byte[] und byte[] in String wandeln.
Bedenke, dass ein String ein char[] ist und ein char vom typ ushort.
Daher ist es u.U. besser per UTF8-Konverter den String in UTF8-Byte[] und umgekehrt zu wandeln.
Ein Blob ist in der FB besser für echte Binärdaten geeignet (Dokumente).
Wie mein Vorredner schon sagt, ein Text-Blob ist ein normaler String und wird, entsprechend des CHARSETS korrekt gewandelt.
In der heutigen Welt sollte man da UTF8 verwenden um multinational zu sein.
Nimmst du hier NONE wird ggf. auch falsch gewandelt, dann ist es besser WIN1252 (ANSI Westeuropa) zu verwenden.
Also "Subtype Text charset UTF8" ist die beste Wahl.
Einen String kannst du dann mit den Konverterklassen System.Text String in byte[] und byte[] in String wandeln.
Bedenke, dass ein String ein char[] ist und ein char vom typ ushort.
Daher ist es u.U. besser per UTF8-Konverter den String in UTF8-Byte[] und umgekehrt zu wandeln.
Ein Blob ist in der FB besser für echte Binärdaten geeignet (Dokumente).
Wie mein Vorredner schon sagt, ein Text-Blob ist ein normaler String und wird, entsprechend des CHARSETS korrekt gewandelt.
In der heutigen Welt sollte man da UTF8 verwenden um multinational zu sein.
Nimmst du hier NONE wird ggf. auch falsch gewandelt, dann ist es besser WIN1252 (ANSI Westeuropa) zu verwenden.
Also "Subtype Text charset UTF8" ist die beste Wahl.
Hallo ihr zwei.
Danke für die Infos.
Die Einstellungen in der Datenbank sind leider vorgegeben und kann diese nicht ändern.
@bfuerchau: Du schreibst den Subtype Binary als Array übergeben.
Das Byte Array zu erzeugen ist nicht das Problem. Aber wie kann ich es dann per SQL übergeben?
Danke
Gruß Andre
Danke für die Infos.
Die Einstellungen in der Datenbank sind leider vorgegeben und kann diese nicht ändern.
@bfuerchau: Du schreibst den Subtype Binary als Array übergeben.
Das Byte Array zu erzeugen ist nicht das Problem. Aber wie kann ich es dann per SQL übergeben?
Danke
Gruß Andre
Anscheinend kennst du dich noch nicht mit den besseren und auch stabileren Parameter-Markern aus:
insert into maytable (f1, f2, ..., fn) values(?, ?, ...,?)
Ein FbCommand-Objekt (so wie jedes DBCommand, von dem abgeleitet wird, hat eine ParameterCollection. Jeder FbParameter hat eine Name- und Value-Eigenschaft.
Entsprechend dem Typ des Zielfeldes erstellst du einen Parameter mit myCommand.CreateParameter().
Zur Laufzeit setzt du nur noch Parameter.Value = myField.
Und machst deinen Execute.
Vorteile:
- Du brauchst dich nicht mehr um die Verdoppelung von Hochkommata in Strings zu kümmern.
- Die Ausführungszeit jedes SQL's das mehrfach verwendet wird, verringert sich.
- Es gibt absolut kein Problem mit SQL-Injection, da du den SQL nicht zusammenstrickst.
- Du brauchst dich nicht um Formatierung von numerischen sowie DateTime-Werten kümmern.
Nachteile:
Absolut keine.
Dokumentation (gilt generell für ADO.Net:
https://learn.microsoft.com/en-us/dotne ... data-types
Desweiteren kannst du dir auch passende Insert/Update/Delete-Commands incl. Parameter auf Basis eines Select generieren lassen.
Hat deine Tabelle auch einen Unique-Key/Primary-Key, wird für Update/Delete auch der Schlüssel korrekt verwendet.
Alles weitere findest du hier. Du kannst dir sehr viel Arbeit sparen, da ADO.Net dir das meiste vollkommen abnimmt. Incl. der Sicherheit bei Mulit-Userbetrieb und Transaktionen.
https://learn.microsoft.com/en-us/dotne ... ndbuilders
Wenn du mit DataTable-Objekten umgehst, kannst du diese per DBDataAdapter komplett mit einem Befehl und den generierten Commands alle Update/Insert/Delete automatisch ausführen lassen.
MyDataAdapter.Update(myDataTable);
Nachtrag:
Mit Parametermarkern arbeite ich schon seit 1995 im SQL-Umfeld (MSADO, VB6, C++) und SQL-Injection war noch nie ein Problem für mich.
insert into maytable (f1, f2, ..., fn) values(?, ?, ...,?)
Ein FbCommand-Objekt (so wie jedes DBCommand, von dem abgeleitet wird, hat eine ParameterCollection. Jeder FbParameter hat eine Name- und Value-Eigenschaft.
Entsprechend dem Typ des Zielfeldes erstellst du einen Parameter mit myCommand.CreateParameter().
Zur Laufzeit setzt du nur noch Parameter.Value = myField.
Und machst deinen Execute.
Vorteile:
- Du brauchst dich nicht mehr um die Verdoppelung von Hochkommata in Strings zu kümmern.
- Die Ausführungszeit jedes SQL's das mehrfach verwendet wird, verringert sich.
- Es gibt absolut kein Problem mit SQL-Injection, da du den SQL nicht zusammenstrickst.
- Du brauchst dich nicht um Formatierung von numerischen sowie DateTime-Werten kümmern.
Nachteile:
Absolut keine.
Dokumentation (gilt generell für ADO.Net:
https://learn.microsoft.com/en-us/dotne ... data-types
Desweiteren kannst du dir auch passende Insert/Update/Delete-Commands incl. Parameter auf Basis eines Select generieren lassen.
Hat deine Tabelle auch einen Unique-Key/Primary-Key, wird für Update/Delete auch der Schlüssel korrekt verwendet.
Alles weitere findest du hier. Du kannst dir sehr viel Arbeit sparen, da ADO.Net dir das meiste vollkommen abnimmt. Incl. der Sicherheit bei Mulit-Userbetrieb und Transaktionen.
https://learn.microsoft.com/en-us/dotne ... ndbuilders
Wenn du mit DataTable-Objekten umgehst, kannst du diese per DBDataAdapter komplett mit einem Befehl und den generierten Commands alle Update/Insert/Delete automatisch ausführen lassen.
MyDataAdapter.Update(myDataTable);
Nachtrag:
Mit Parametermarkern arbeite ich schon seit 1995 im SQL-Umfeld (MSADO, VB6, C++) und SQL-Injection war noch nie ein Problem für mich.