Inhalt von RTB als ByteArray speichern

  • WPF

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    Inhalt von RTB als ByteArray speichern

    Hi, ich benutze derzeit 2 dinge sehr umständlich, ich ziehe bytes aus SQL, wandle dies um in eine XAML Datei und speichere die. Danach lese ich diese wieder ein in eine Richtextbox. Hier die 2 codes:

    VB.NET-Quellcode

    1. Dim bytesLoad As Byte()
    2. Dim Command As New SqlCommand("SELECT [Spalte2] FROM dbo.[Datenbank] where [Index] = '" & DG_Selected & "'")
    3. Command.Connection = connection
    4. Dim adapter As New SqlDataAdapter(Command)
    5. Dim table As New DataTable()
    6. adapter.Fill(table)
    7. For i = 0 To table.Rows.Count - 1
    8. For Each row In table.Rows
    9. bytesLoad = CType(table.Rows(i).Item("Spalte2"), Byte())
    10. Using fs As FileStream = New FileStream(file & ".XAML", FileMode.Append)
    11. Dim len As Long = bytesLoad.Length
    12. While fs.Position < bytesLoad.Length
    13. fs.Write(bytesLoad, 0, bytesLoad.Length)
    14. End While
    15. fs.Close()
    16. fs.Dispose()
    17. My.Computer.FileSystem.WriteAllBytes(file & ".XAML", bytesLoad, False)
    18. End Using
    19. Next
    20. Next


    VB.NET-Quellcode

    1. If File.Exists(file & ".XAML") Then
    2. Dim t As TextRange = New TextRange(Me.RTB.Document.ContentStart, Me.RTB.Document.ContentEnd)
    3. Dim File1 As FileStream = New FileStream(file & ".XAML", FileMode.Open)
    4. t.Load(File1, System.Windows.DataFormats.XamlPackage)
    5. File1.Close()
    6. End If


    Dies ist der Lade vorgang aus SQL.

    Nun gibts es auch den Speichervorgang:

    VB.NET-Quellcode

    1. Dim Imgbuffer() As Byte
    2. Dim t As TextRange = New TextRange(Me.RTB.Document.ContentStart, RTB.Document.ContentEnd)
    3. Dim file1 As FileStream = New FileStream(file & ".XAML", FileMode.Create)
    4. t.Save(file1, System.Windows.DataFormats.XamlPackage)
    5. file1.Close()


    VB.NET-Quellcode

    1. Using fsreader As New FileStream(file & ".XAML", FileMode.Open, FileAccess.Read)
    2. ReDim Imgbuffer(CType(fsreader.Length - 1, Integer))
    3. Using breader As New BinaryReader(fsreader)
    4. breader.Read(Imgbuffer, 0, CType(fsreader.Length, Integer))
    5. End Using
    6. End Using


    und danach der insert befehl für den imgbuffer in das SQL.

    nun ist meine Frage, könnte mir das jemand umbauen in einen Memory stream(oder alternative?) ? Dass also nichts mehr auf der platte zwischengespeichert werden muss?

    habe da nichts gutes in Google gefunden und erfarhung mit memory stream habe ich auch 0.

    Danke

    * Schlecht gewählten Titel geändert * ~NoFear23m

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

    @r0tzi MemoryStream ist in diesem Sinne wie FileStream.
    Erstellen, Befüllen,
    den Zeiger auf 0 setzen (das entspricht Close() und Open())
    Auslesen.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    klar, habe etwas rumprobiert, aber der memstream will byte .. die XAML erstelle ich ja aber mit einer Textrange von der RTB ... also muss zu erst die textrange zu byte.

    Wenn ich die Textrange gleich zu byte umwandeln kann, dann benötige ich den zwischenschritt ja gar nicht und kann es direkt importieren ins SQL.
    beim aulesen wäre es ja genauso, ich lese die byte aus, und mach eine textrange wieder draus. wie geht das?:D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mich deucht, der Ansatz aus post#2 ist zielführender.
    Du sagst, du hättest damit schon rumprobiert - dürfen wir sehen, was?
    (naja, existiert vmtl nicht mehr)
    Oder schreib einfach mal eine vernünftig benannte Methode, der übergeben wird, was sie bearbeitn soll, und die das Ergebnis returnt. Muss ja nicht funktionieren, aber dann hat man was, was man in Funnktion bringen kann.

    Verstehe ich das richtig, dass die Methode ein Bild aus einer Wpf-Textbox auspuhlen soll, und als Byte() returnen?
    Muss doch machbar sein.
    Verstehe ich das richtig, dass die Methode ein Bild aus einer Wpf-Textbox auspuhlen soll, und als Byte() returnen?

    Das ist hier eine sehr gute Frage, ich würde aktuell noch vermuten :

    Kompletten Inhalt der RichTextBox(inkl. bilder, Links usw.) -> zu einem ByteArray, um dieses in der SQL-Datenbank zu hinterlegen. Zum auslesen, erhält er aus der SQL-Datenbank wieder ein ByteArray zurück, dieses soll dann wohl wieder zurück zu einem "RichTextBoxInhalt" (Bin mir nicht sicher wie dies bei der WPF ist, unter Forms geht es vermutlich um RichText, anstelle von Text) damit die RichtextBox wieder identsich ist, zu vor dem abspeichern.

    Aber wie ErfinderDesRades schon gesagt hat, kann man dir aktuell nicht zu 100% folgen was genau du nun meinst.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Da ich gerade auf arbeit bin, fehlt mir die Möglichkeit es zu testen aber versuch es mal so in der Art (Nicht 1zu1 übernehmen, nur als Denkanstoss zu verstehen):


    VB.NET-Quellcode

    1. 'laden
    2. Dim bytesLoad As Byte() ' da halt wieder das aus SQL geladene rein wie zuvor
    3. Dim t As New TextRange(rtb1.Document.ContentStart, rtb1.Document.ContentEnd)
    4. t.Load(New MemoryStream(bytesLoad), DataFormats.Rtf)
    5. 'in den Stream speichern
    6. Dim SaveStream As MemoryStream = New MemoryStream
    7. t.Save(SaveStream, DataFormats.Rtf)

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Danke aber so funktioniert es nicht. jetzt 1 std rumprobiert... er speichert nicht sin den SQL. was muss ich bei dem parameter angeben? den Savestream?

    VB.NET-Quellcode

    1. Dim t As TextRange = New TextRange(Me.RTB1.Document.ContentStart, RTB1.Document.ContentEnd)
    2. Dim savestream As MemoryStream = New MemoryStream
    3. t.Save(savestream, DataFormats.Rtf)


    Quellcode

    1. Command.Parameters.AddWithValue("@RTB", savestream)


    also so kommen keine bytes im SQL an
    Was erwartet SQL denn für einen Datentyp ? Aktuell erstelst du ja einen MemoryStream und speicherst die Textrange in diesem. ein Stream ist wenn ich nicht irre schlicht ein anderes Wort für ein ByteArray.


    Aber evtl. kann dir das jemand anderes beantworten, ich habe selbst nur gegoogelt und konnte wie gesagt bislang nicht testen wie/ob es so funktioniert. Evtl. befinde ich mich hier selbst schlicht auf dem Holzweg.

    Versuchen würde ich es noch mit deiner SpeicherLogik aus dem 1ten Post, nur das ich anstelle eines FileStreams, den erstellten MemoryStream (savestream) benutzen würde also etwa so:

    VB.NET-Quellcode

    1. Dim SaveStream As MemoryStream = New MemoryStream
    2. t.Save(SaveStream, DataFormats.Rtf)
    3. ReDim Imgbuffer(CType(SaveStream.Length - 1, Integer))
    4. Using breader As New BinaryReader(SaveStream)
    5. breader.Read(Imgbuffer, 0, CType(SaveStream.Length, Integer))
    6. End Using

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    Und den RTF Text (richtextbox.rtf)einfach direkt in Textform in die DB schreiben ist keine Lösung?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @r0tzi .Rtf ist eine Property vom Typ String, die alle Informationen der RTB enthält.
    Diese kannst Du über einen BaseString64 konvertieren:
    docs.microsoft.com/de-de/dotne…ing?view=netframework-4.8
    docs.microsoft.com/de-de/dotne…ing?view=netframework-4.8
    Da hast Du das Byte-Array, die Du streamen kannst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @asusdk ist bestimmt nah dran


    Oh... da überschätzt du mich aber mehr als gewaltig....

    Poste evtl. mal deinen Kompletten Code, dann lässt sich das evtl. leichter nachvollziehen.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Probierma mit sowas:

    VB.NET-Quellcode

    1. Public Shared Function GetContentBytes(t As TextRange) As Byte()
    2. Using strm = New MemoryStream
    3. t.Save(strm, DataFormats.Rtf)
    4. Return strm.ToArray
    5. End Using
    6. End Function
    7. Public Shared Sub SetContentBytes(t As TextRange, content As Byte())
    8. Using strm = New MemoryStream(content)
    9. t.Load(strm, DataFormats.Rtf)
    10. End Using
    11. End Sub
    ungetestet

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

    Hallo @r0tzi

    Sorry das ich mich hier einmische. Gehts dir rein um das speichern des Inhalts einer RTF so wie er ist in eine Datenbankspalte und das wieder auslesen aus dieser damit in der RTF alles wieder so angezeigt wird wie es war?

    VB.NET-Quellcode

    1. Public Function GetText(ByVal document As System.Windows.Documents.FlowDocument) As String
    2. Dim tr As TextRange = New TextRange(document.ContentStart, document.ContentEnd)
    3. Dim ms As MemoryStream = New MemoryStream
    4. tr.Save(ms, DataFormats.Xaml)
    5. Return ASCIIEncoding.Default.GetString(ms.ToArray)
    6. End Function


    VB.NET-Quellcode

    1. Public Sub SetText(ByVal document As System.Windows.Documents.FlowDocument, ByVal text As String)
    2. If String.IsNullOrEmpty(text) Then
    3. document.Blocks.Clear
    4. Else
    5. Dim tr As TextRange = New TextRange(document.ContentStart, document.ContentEnd)
    6. Dim ms As MemoryStream = New MemoryStream(Encoding.ASCII.GetBytes(text))
    7. tr.Load(ms, DataFormats.Xaml)
    8. End If
    9. End Sub


    Ich hoffe es hilt dir.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##