Convert.ToBase64....

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von weiss_gabi.

    Convert.ToBase64....

    Hallo ihr Lieben,

    ich plage mich noch mit einem kleinen Problemchen, welches vielleicht aber doch nicht so einfach lösbar ist.

    also hier die Problematik:
    in eine Datenbankfeld soll so ein bißchen "Fließtext", also frei formuliert, mit Absätzen, Umlauten, Sonderzeichen usw. gespeichert werden.

    Damit das zu keinen Problemen beim Insert führt, habe ich folgende Technik verwendet:

    Convert.ToBase64String(New System.Text.UTF8Encoding().GetBytes("hier kommt der Text dann hin mit allen Sonderzeichen und was es da sonst noch so gibt"))

    und ausgelesen habe ich das wieder mit

    New System.Text.UTF8Encoding().GetString(Convert.FromBase64String(CStr(myData("spaltenname"))))

    Das funktioniert auch ganz prima, alle Zeilenumbrüche, Sonderzeichen und und und bleiben erhalten.


    Nun möchte ich in dieser Spalte mit LIKE suchen....

    Das klappt bis jetzt leider nicht.

    meine erste Lösungsansatz: das Suchwort auch entsprechend wie oben erwähnt konvertieren, also z.B. so

    Convert.ToBase64String(New System.Text.UTF8Encoding().GetBytes("SUCHSTRING"))


    Leider funktioniert das nicht.

    Wie kann man solche mehrzeiligen Textfelder mit allerlei Sonderzeichen so in der MySQL-DB speichern, dass man diesen Text später auch mit SELECT .... LIKE auslesen kann ?

    ein schönes Wochende wünscht

    die ewig auf der Suche nach den richtigen Antworten befindliche Gabi :)
    das mit dem nochmal konvertieren sollte eig. klappen, ABER ich weiß nicht wie dein projekt bzw. seine größe aussieht, wenn es sich um kleine mengen daten handelt, könntest du sie decodiert in ein stringarray laden, und dort suchen.
    gruß,
    manawyrm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manawyrm“ ()

    Nun möchte ich in dieser Spalte mit LIKE suchen....
    hab ich dich richtig verstanden das du eine spalte hast aus welcher du einen zeileninhalt mit

    VB.NET-Quellcode

    1. New System.Text.UTF8Encoding().GetString(Convert.FromBase64String(CStr(myData("spaltenname"))))
    definiert auslesen kannst
    aber du nun eine sql anweisung brauchst mit der du die zeile bestimmen kannst ( suchen ) ?


    und : ist das mysql oder mssql ?

    und2 : ein "mögliches" suchwort/zeichenfolge bitte
    Um Probleme mit Sonderzeichen zu vermeiden bei einem Insert ist die sinnvollste und einfachste Methode die Datensätze mit einem Command-Object einzufügen und dabei den Text als Parameter-Value zu übergeben.

    Der Vorteil dabei ist dann das der Text selber in der Datenbank steht und daher direkt durchsuchbar ... z.B. mit Like.

    Gruß

    Rainer
    als ich maches es noch einmal ganz konkret, damit ihr genau seht, was ich meine.

    @Triple-Axe

    zunächst mal geht es um MySQL

    ich habe eine Spalte in einer Tabelle, sagen wir mit dem Namen Beschreibung, dort steht z.B.
    SGllciBpc3QgZGllIEdhYmkgIQ==

    das habe in erzeugt, indem ich mit den beiden Methoden oben, den eingegebenen Text kodiert habe und beim Anzeigen wieder mit den Methoden dekodiere.
    das funktioniert einwandfrei und ohne Fehler.

    nun möchte ich in dieser Spalte z.B. mit LIKE suchen, z.B. nach dem Wort: Gabi (das kommt da oben drin vor, kodiert eben)

    dann habe ich folgendes versucht:

    SELECT * FROM Tabelle WHERE Beschreibung LIKE '%R2FiaQ==%' (das heißt dort decodiert: LIKE '%Gabi%')

    Klappt aber nicht.

    Die Alternative, die Daten erst auszulesen, im Klartext in eine Array zu schreiben und dort zu suchen, finde ich nicht so gelungen, denn ich bin mir sicher, dass MySQL für solche einfachen Fälle die passenden Werkzeuge bereithält, ich habe sie bloß noch nicht gefunden.

    @raist10
    mit einem Command-Object einzufügen und dabei den Text als Parameter-Value zu übergeben

    Ich weiß nicht genau, was du damit meinst, kannst du mir ein Beispiel dazu aufschreiben...

    ich führe die Insert immer so aus

    cmd.Connection = con
    cmd.CommandText = QueryString <-- und hier steht der ganz normale INSERT - Befehl drin, also INSERT INTO Tabelle (id,name,blablabla) VALUES ("diese_name","blablalba")

    cmd.ExecuteNonQuery()

    aber dann dürfen die eingefügten "Values" eben nicht wie in diesem Fall ein " enthalten, sonst paßt der INSERT Befehl ja nicht mehr.

    Sieht MySQL denn nicht eine einfache Methode vor, Werte zu kodieren und zu decodieren, damit man solche Problemchen nicht hat, das muß doch irgendwie richtig gehen.

    schon mal viiiiiieeelen Dank für eure beträchtlichen Mühen mit meinem Problemchen

    Gabi :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „weiss_gabi“ ()

    @ gabi

    Habe Dein Problem dann wirklich richtig verstanden und dann ist Deine Lösung der absolut falsche Ansatz. Es funktioniert schon so wie ich es Dir geschrieben habe.

    Hier ein Beispiel wie es von der Systematik her geht (aber mit dem Objektmodll für SQLite, allerdings kannst Du die Vorgehensweise fast 1 zu 1 auf das Objektmodell für MySQL ummünzen):

    VB.NET-Quellcode

    1. Dim SQLCommand As SQLite.SQLiteCommand = Nothing
    2. Dim SQLReader As SQLite.SQLiteDataReader = Nothing
    3. '// hier wird das Paramter-Object deklariert und initialisiert,
    4. '// Du musst bei Dir dann DbType.Text oder was auch immer der Datentyp in der DB ist einstellen
    5. '// beachte bitte dabei das "@blob" der Parameter-Name ist der dann im SQL-Statement als Placeholder eingefügt wird
    6. Dim SQLparm As New SQLite.SQLiteParameter("@blob", DbType.Binary)
    7. Dim strSQL As String
    8. '// hier wird das Insert-Statement erzeugt und für das Tabellenfeld "DokDokument" eben angeben das als Value der Inhalt des Paramters
    9. '// mit dem Namen "@blob" eingefügt wird
    10. strSQL = "INSERT INTO tbl2Dokumente (DokID, DokCounter, TimeStamp, DokDokument) VALUES ('" & strDokID & "', " & intDokCounter & ", strftime('%Y-%m-%d %H:%M:%S', 'now'), @blob)"
    11. '// erzeugt das Command-Object mit der Connection die im Klassen-Member sLite gehalten wird
    12. SQLCommand = sLite.CreateCommand
    13. '// Zuweisung des SQL-Strings als CommandText
    14. SQLCommand.CommandText = strSQL & ";"
    15. '// hier übergibst Du an das Paramter-Object Deinen Text den Du einfügen willst, also dann in Deinem Fall
    16. '// kein Byte-Array sondern schlicht der normale Textstring
    17. SQLparm.Value = bteArr
    18. '// dem Command-Object wird das Parameter-Object hinzu gefügt
    19. SQLCommand.Parameters.Add(SQLparm)
    20. '// das Command-Object wird ausgeführt
    21. SQLReader = SQLCommand.ExecuteReader


    Das ist ein Insert mit einem Parameter-Object. Im Prinzip absolut simple und wie Du erkennst ist der Vorteil dabei das der einzufügende Text eben nicht im SQL-Statement auftaucht wo eben Sonderzeichen Schwierigkeiten machen, sondern der Text dann direkt in das Parameter-Object als String eingefügt wird. Also alles was im String ist taucht auch so in der Datenbank unverändert auf ... selbst Hochkommas.

    Gruß

    Rainer

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „raist10“ ()

    d.h. du bekommst die zeichen korrekt gespeichert nur beim auslesen haperts ?

    kannst du mal ein stück aus der tabellenzelle posten und deine sql anweisung dazu

    weil :

    wenn du in der tabelle

    Quellcode

    1. SGllciBpc3QgZGllIEdhYmkgIQ==
    stehen hast wiso suchst du dann nach

    SQL-Abfrage

    1. SELECT * FROM Tabelle WHERE Beschreibung LIKE '%
    2. R2FiaQ==
    3. %'


    von rechts nach links gesehen :

    == und Q sind ok aber das a z.b. ist ein I in der tabelle. die zeichen kommen demnach nicht vor

    ich habe bei mir mal das getestet und eine tabelle angelegt und deine SGllciBpc3QgZGllIEdhYmkgIQ== als message gespeichert

    schau dir mal den screenshot an darum frage ich *G

    extra das erste und das letzte zeichen nicht als suchbegriff genommen
    Bilder
    • eine zeile.png

      31,86 kB, 1.014×438, 101 mal angesehen
    • alle zeilen.png

      36,75 kB, 994×470, 106 mal angesehen
    noch mal zu Aufklärung:

    sowohl das Schreiben als auch das Lesen funktionieren einwandfrei und fehlerlos.

    Die Zeichenfolge SGllciBpc3QgZGllIEdhYmkgIQ==
    heißt dekodiert: Hier ist Gabi !

    gesucht habe ich nach dem Wort: Gabi, das ist kodiert: R2FiaQ==

    ich weiß auch nicht, warum die nicht gleich sind bzw. das eine in dem anderen nicht buchstäblich enthalten ist...

    ich denke aber, ich werde an dem Tipp von raist10 weiterarbeiten und es ohne eine Kodierung der Zeichen versuchen, also mit der MySQL Parameter Version.
    Die Lösung scheint mir am Praktisten zu sein, denn dann kann ich alle MySQL Feinheiten wie z.B. UCase und LCase auch verwenden.

    Lieben Gruß
    Gabi
    ich weiß auch nicht, warum die nicht gleich sind bzw. das eine in dem anderen nicht buchstäblich enthalten ist...
    Base64 verpackt 3 Bytes (Zeichen) in 4 Zeichen.
    Deshalb findest du den Teilstring nicht (ausser Anfang und Ende des Teilstrings treffen gerade zufällig auf die Byte-Grenzen).
    Befass dich mal mit den Base64-Grundlagen, dann verstehst du's vielleicht selbst:
    de.wikipedia.org/wiki/Base64
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    weiss_gabi schrieb:


    ich denke aber, ich werde an dem Tipp von raist10 weiterarbeiten und es ohne eine Kodierung der Zeichen versuchen, also mit der MySQL Parameter Version.
    Die Lösung scheint mir am Praktisten zu sein, denn dann kann ich alle MySQL Feinheiten wie z.B. UCase und LCase auch verwenden.


    Es ist für Dein Vorhaben tatsächlich die einzig sinnvolle Lösung. Es macht keinen Sinn eine Codierung zu nutzen, wenn Du über die Nutzung eines Parameters Dir den Aufwand gar nicht machen brauchst. Da damit alles viel einfacher/sinnvoller geht ... Teilstring direkt in der DB bearbeiten/suchen und das zurück lesen wird auch simpelst da Du einfach einen String zurück bekommst und damit direkt weiter arbeiten kannst.

    Gruß

    Rainer
    @petaod
    puh.... ich bin froh, dass ich jetzt ohne Bas64 auskomme, aber danke für den Hinweis, ich werde es im Kopf behalten.

    so, ich habe mich ein wenig mit der Syntax für den INSERT und UPDATE Befehl beschäftigt und es funktioniert alles einwandfrei...


    zur Syntax
    es geht ungefähr bei mysql so:

    VB.NET-Quellcode

    1. Dim SQLparm As New MySqlParameter("@blob", MySqlDbType.Text)
    2. cmd.Connection = con
    3. cmd.CommandText = QueryString
    4. cmd.Parameters.AddWithValue("@blob", beschreibung_str) 'hier ist die Syntax eine etwas andere als raist10 gepostet hatte, da haben die wohl was neu gemacht
    5. myData = cmd.ExecuteReader()


    und beschreibung_str ist der Inhalt z.B. eines mehrzeiligen Textfeldes mit Sonderzeichen, neuen Zeilen und und und

    und wobei es im QueryString (hier verkürzt) einfach heißt

    SQL-Abfrage

    1. INSERT INTO tabellen_name(titel, url, beschreibung) VALUES("Titel_eintrag","url_eintrag",@blob)




    Super Sache und nochmals vielen Dank an alle, die sich so intensive mit meinem kleinen Problem beschäftigt haben :)

    Gruß
    Gabi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „weiss_gabi“ ()