Announcement

Collapse
No announcement yet.

RichText-Inhalt direkt als BLOB in SQL-DB speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RichText-Inhalt direkt als BLOB in SQL-DB speichern

    Hallo zusammen,

    ich habe folgendes Problem: Ich möchte in einer Spalte der Datenbank(MS SQL2005) den Inhalt einer RichTextBoxt abspeichern(im RTF-Format), den ich vorher da per Drag and Drop abgelegt habe. Wie ich eine rtf-Datei von Festplatte in die DB schiebe und wieder heraushole ist kein Problem, ich möchte jedoch in diesem Fall den Inhalt im RTF-Format direkt und ohne Umweg als Datei zwischenzulagern in den Datensatz schreiben. Hintergrund ist der, dass in der Datenbank im jeweiligen Datensatz ein Verweis auf das zugehörige Lotus-Notes-Dokument abgelegt werden soll und das funktioniert nur mit dem RTF- oder DOC-Format korrekt. Im Optimalfall würde man einen neuen Datensatz anlegen, die Dokumentverknüpfung aus Notes auf die kleine RT-Box ziehen und ablegen - Datensatz speichern, fertig. Andersherum natürlich genauso: beim Blättern durch die Datensätze soll dann der Inhalt des BLOB-Feldes in der RT-Box als RichText angezeigt werden, also im Prinzip die RichTextBox per DataBindings an die BLOB-Spalte gebunden werden(womit sich dann durch einen Doppelklick auf die im RichText eingebettete Verknüpfung Notes mit dem entsprechenden Dokument öffnet :-))
    Leider hab ich auch durch intensive Suche noch keine praktikable Lösung gefunden, das Ganze zu bewerkstelligen, OHNE vorher in irgendeiner Art erst eine temporäre Datei zu schreiben :-(

    Hat vielleicht jemand eine Idee oder ein Codebeispiel? Bin für jede Hilfe dankbar!!!

  • #2
    SaveFile kann nicht nur in eine Datei speichern, sondern auch in einen Stream. Benutze doch einfach einen MemoryStream. Diesen Stream sollte man dann auch ohne Probleme in die DB bekommen.

    Hier speichern die Daten aus einen MemoryStream in einer Datenbank.

    Comment


    • #3
      Vielen Dank erstmal für die schnelle Antwort!
      Das der RT-Box Inhalt per Stream in die DB wandert habe ich mir schon gedacht .

      Originally posted by fanderlf View Post
      Diesen Stream sollte man dann auch ohne Probleme in die DB bekommen.
      Und genau da liegt das Problem ;-) Ich bekomme den Inhalt eben nicht ohne Probleme in die DB, weil mir irgendwie der richtige Ansatz fehlt :-( Ich hab jetzt auch schon mehrere verschiedene Varianten gefunden und probiert, aber passt nix wirklich so wie es soll... irgendwie hab ich da eine Denkblockade...Vom Ablauf her muss es ja so aussehen: RTB-Inhalt per StreamWriter als RichText in den Datensatz schreiben, anders herum beim Selektieren des Datensatzen den Inhalt per StreamReader auslesen und in die RT-Box schreiben. jeweils als Byte-Array... Nur am Umsetzen hapert es jetzt noch gewaltig...

      Comment


      • #4
        Wo ist denn das Problem? Die SaveFile Funktion speichert ihre Daten in den Stream (in diesem Fall MemoryStream). Und in dem 2. Beispiel wird erklärt wie man einen MemoryStream in einer Datenbank ablegt. Ich versteh nicht ganz wo das Problem liegt.

        Comment


        • #5
          Vielleicht hift das weiter:

          [highlight=vbnet]
          Dim NewRow As Integer
          Dim RawData() As Byte
          Dim FileSize As Long

          Using Fs As IO.FileStream = New IO.FileStream(MyFile, IO.FileMode.Open, IO.FileAccess.Read)
          FileSize = Fs.Length

          RawData = New Byte(CType(FileSize, Integer)) {}
          Fs.Read(RawData, 0, CType(FileSize, Integer))
          Fs.Close()
          End Using

          SQL = "INSERT INTO tbl(MyFile) VALUES (@MyFile)"

          Dim cmd As New Data.SqlClient.SqlCommand
          With cmd
          .Connection = cnn
          .CommandText = SQL
          .CommandTimeout = MyTimeOut
          With .Parameters
          .AddWithValue("@MyFile", RawData)
          End With
          NewRow = .ExecuteNonQuery()
          End With
          [/highlight]

          Comment


          • #6
            Das Problem des Schreibens in die DB hab ich jetzt so gelöst:
            [highlight=vbnet]
            RichTextBox1.SaveFile(rtfInput, RichTextBoxStreamType.RichText)
            aByteArray = rtfInput.ToArray()
            Dim cn As New SqlConnection("server=localhost;integrated security=yes;database=db_user")
            cn.Open()
            Try
            Dim sSQL As String = "INSERT INTO testtable (image,text) VALUES (@image,@text)"
            Dim aCmd As New SqlCommand(sSQL, cn)
            With aCmd
            .Parameters.Add("@image", aByteArray)
            .Parameters.Add("@text", TextBox1.Text)

            .ExecuteNonQuery()
            End With
            Finally
            cn.Close()
            End Try

            [/highlight]
            Allerdings werd ich mir den oben geposteten Code auch noch einmal zu Gemüte führen ;-)
            Jetzt hab ich natürlich das Problem des Auslesens, wo mir jeglicher Ansatz fehlt. Die Controls in der Eingabemaske der DB sind ja an die anderen Spalten gebunden, wie kann ich denn jetzt erreichen, dass z.B. bei Auswahl eines Datensatzen im Grid bzw. über einen BindingNavigator der Binary-Inhalt wieder korrekt als RTF in der RT-Box angezeigt wird?

            PS: es hilft im Übrigen wirklich, mal ein Codebeispiel zu sehen, da kann ich mir das bedeutend besser vorstellen :-)
            Zuletzt editiert von communi; 05.07.2010, 14:06.

            Comment


            • #7
              Ich hatte oben 2 Links geposted in denen auch Codebeispiele standen

              Andersrum musst Du das wohl manuell machen. Zum Beispiel mit dem CurrentChanged Event der BindingSource. Mit LoadFile kann man analog zum Speichern die Daten aus einem BLOB Feld der Datenbank wieder einlesen.

              Achja... ich würde die BLOBs übrigens nur bei Bedarf nachladen, sonst wird die Performance Deines Programms miserabel. Den Fehler hab ich früher auch schon mal gemacht

              Comment


              • #8
                Das mit den Links stimmt natürlich, allerdings war der 2 für C# und hat mir nicht weitergeholfen, den 1. auf die MSDN hab ich allerdings ausgiebig verwendet ;-)
                Ich hab das lesen aus der DB jetzt so gelöst(für den Fall, dass es mal jemand zufällig braucht)

                [highlight=vbnet]
                Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
                Dim cn As New SqlConnection("server=localhost;integrated security=yes;database=db_user")
                Dim cmdSel As New SqlCommand("SELECT text, image FROM testtable", cn)
                Dim da As New SqlDataAdapter(cmdSel)
                Dim dt As New DataTable("testtable")

                cn.Open()
                da.Fill(dt)
                cn.Close()
                BindingSource1.DataSource = dt
                TextBox5.DataBindings.Add("Text", BindingSource1, "text")
                showrtf()
                AddHandler BindingSource1.PositionChanged, New EventHandler(AddressOf Me.bs_PositionChanged)
                MyBase.OnLoad(e)
                End Sub

                Private Sub bs_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
                showrtf()
                End Sub

                Private Sub showrtf()
                Dim drv As DataRowView = CType(BindingSource1.Current, DataRowView)
                Dim arr() As Byte = CType(drv("image"), Byte())
                Dim ms As New MemoryStream(arr)

                RichTextBox1.LoadFile(ms, RichTextBoxStreamType.RichText)
                ms.Close()
                End Sub
                [/highlight]

                Du hast natürlich Recht mit der Performance, der Notes-Dokumentlink wird dann nur bei Bedarf auf Knopfdruck geladen. Bin ja erstmal froh, daß es überhaupt soweit funktioniert :-D

                Also nochmal vielen Dank an alle Beteiligten, ich hoffe mal, mein Problem ist damit fürs erste gelöst! :-)

                Comment

                Working...
                X