Announcement

Collapse
No announcement yet.

PDF-, Word- oder Exceldatei aus dem SQL-Server lesen und auf dem Bildschirm ausgeben

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

  • PDF-, Word- oder Exceldatei aus dem SQL-Server lesen und auf dem Bildschirm ausgeben

    Hallo zusammen,
    ich möchte eine Datei, welche ich als BLOB in einer Datenbank gespeichert habe wieder auslesen und gleich auf dem Bildschirm anzeigen ohne diese zwischen zu speichern.

    Das auslesen der Datei aus der Datenbank mache ich wie folgt:

    Code:
    Dim conn As New Data.SqlClient.SqlConnection(PstrConnString)
        Dim cmd As New Data.SqlClient.SqlCommand
        Dim myData As Data.SqlClient.SqlDataReader
        Dim SQL As String
        Dim RawData() As Byte
        Dim FileSize As Long
    
        SQL = "SELECT TOP 1 Name, Extension, FileSize, MyFile FROM Binaer ORDER By IDBin DESC"
    
        Try
          conn.Open()
    
          cmd.Connection = conn
          cmd.CommandText = SQL
    
          myData = cmd.ExecuteReader
    
          If Not myData.HasRows Then Throw New Exception("Es sind keine BLOBs zum speichern vorhanden")
    
          myData.Read()
    
          FileSize = myData.GetInt32(myData.GetOrdinal("FileSize"))
          RawData = New Byte(CType(FileSize, Integer)) {}
    
          myData.GetBytes(myData.GetOrdinal("MyFile"), 0, RawData, 0, CType(FileSize, Integer))
    
    'hier schreibe ich die Datei noch auf die Festplatte
    'ich möchte aber an dieser Stelle die Datei direkt auf dem Bildschirm anzeigen
    
          Using Fs As New IO.FileStream("E:\" & myData!Name.ToString, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
            Fs.Write(RawData, 0, CType(FileSize, Integer))
            Fs.Close()
          End Using
          MessageBox.Show("Datei vollständig gespeichert!", "Erfolgreich!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
    
          myData.Close()
          conn.Close()
        Catch ex As Exception
          MessageBox.Show("Es ist ein Fehler aufgetreten: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    Hat jemand eine Idee wie ich das hinbekomme...?

    Danke

  • #2
    Hallo,

    das geht meines Wissens nicht. Die Interop-Bibliotheken für Word 2003 u. Word 2007 bieten für das Öffnen eines Dokuments lediglich die Methode Documents.Open(ref object FileName, ...).

    Gruss

    Comment


    • #3
      Ein bestehendes Worddokument kann ich wie folgt öffnen:

      Code:
      Dim appWord As New Word.Application
          Dim docWord As New Word.Document
      
          Try
            docWord = appWord.Documents.Open("E:\Test.doc")
            appWord.Visible = True
          Catch ex As Exception
            MsgBox(ex.Message)
          End Try
      Aber kennt jemand eine Möglichkeit Daten, wie ich sie oben aus der Datenbank lese, direkt ins Word zu schreiben ?

      Comment


      • #4
        Originally posted by maro158 View Post
        ... bieten für das Öffnen eines Dokuments lediglich die Methode Documents.Open(ref object FileName, ...).
        Man beachte "lediglich". Es gibt also (jedenfalls für Word und Excel) nichts anderes. Aber was spricht dagegen, die Datei im Temp-Ordner zwischenzuspeichern?

        Ich vermute, für das Anzeigen einer PDF-Datei gibt es sowieso nur Process.Start(); auch dafür brauchst Du eine "echte" Datei.

        Jürgen

        Comment


        • #5
          Originally posted by M Merlin View Post
          Ein bestehendes Worddokument kann ich wie folgt öffnen:

          Code:
          Dim appWord As New Word.Application
              Dim docWord As New Word.Document
          
              Try
                docWord = appWord.Documents.Open("E:\Test.doc")
                appWord.Visible = True
              Catch ex As Exception
                MsgBox(ex.Message)
              End Try
          Aber kennt jemand eine Möglichkeit Daten, wie ich sie oben aus der Datenbank lese, direkt ins Word zu schreiben ?

          Sorry, ich hatte versehentlich die C#-Signatur für Documents.Open verwendet.

          Nein, man kann BLOB-Daten nicht direkt in ein Word-Dokument schreiben. Du könntest allerdings die variablen Teile deines Dokuments in entsprechende DB-Felder speichern und bei Bedarf in ein neues Word-Dokument dynamisch einfügen.

          Comment


          • #6
            Die Dokumente haben kein bestimmtes Schema, welche ich in die Datenbank speichern möchte.

            Der Hintergrund ist folgender:
            Es sollen alle Arten von Dokumenten, von Scanns über Word, Excel, Powwerpoint etc., zu einem bestimmten Vorgang in eine Datenbank gespeichert und dann auch wieder abgerufen werden...

            Comment


            • #7
              Es scheint doch zugehen....
              ...Aber irgenwied muss ich das ByteArray anderst einfügen...
              Hier mein Code:

              Code:
               Dim conn As New Data.SqlClient.SqlConnection(PstrConnString)
                  Dim cmd As New Data.SqlClient.SqlCommand
                  Dim myData As Data.SqlClient.SqlDataReader
                  Dim SQL As String
                  Dim RawData() As Byte
                  Dim FileSize As Long
              
                  SQL = "SELECT TOP 1 Name, Extension, FileSize, MyFile FROM Binaer ORDER By IDBin DESC"
              
                  With Me.StatusStrp
                    .Text = "Lese Datei aus Datenbank...."
                    .Refresh()
                  End With
              
                  Dim tsRead As TimeSpan = CType(Now.TimeOfDay, TimeSpan)
              
                  Try
                    conn.Open()
              
                    cmd.Connection = conn
                    cmd.CommandText = SQL
              
                    myData = cmd.ExecuteReader
              
                    If Not myData.HasRows Then Throw New Exception("Es sind keine BLOBs zum speichern vorhanden")
              
                    myData.Read()
              
                    FileSize = myData.GetInt32(myData.GetOrdinal("FileSize"))
                    RawData = New Byte(CType(FileSize, Integer)) {}
              
                    myData.GetBytes(myData.GetOrdinal("MyFile"), 0, RawData, 0, CType(FileSize, Integer))
              
                    tsRead = Now.TimeOfDay - tsRead
              
                    With Me.StatusStrp
                      .Text = "Schreibe Datei lokal...."
                      .Refresh()
                    End With
              
                    Dim tsWrite As TimeSpan = CType(Now.TimeOfDay, TimeSpan)
              
                    'Using Fs As New IO.FileStream("E:\" & myData!Name.ToString, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
                    '  Fs.Write(RawData, 0, CType(FileSize, Integer))
                    '  Fs.Close()
                    'End Using
              
                    Dim appWord As New Word.Application
                    Dim docWord As New Word.Document
              
                    Try
                      'docWord = appWord.Documents.Open("E:\Test.doc")
                      docWord = appWord.Documents.Add
              
                      docWord.Range.InsertAfter(System.Text.Encoding.Default.GetString(RawData, 0, CType(FileSize, Integer)))
              
                      appWord.Visible = True
                    Catch ex As Exception
                      MsgBox(ex.Message)
                    End Try
              
                    tsWrite = Now.TimeOfDay - tsWrite
              
                    With Me.StatusStrp
                      .Text = String.Empty
                      .Refresh()
                    End With
                    myData.Close()
                    conn.Close()
              
                    MessageBox.Show("Datei vollständig gespeichert!" & vbCrLf & vbCrLf & "Dateigröße: " & FileSize / 1024 & " KB" & vbCrLf & "Zeit lesen: " & tsRead.TotalSeconds & " sec" & vbCrLf & "Speed lesen : " & FileSize / 1024 / tsRead.TotalSeconds & " KB/sec" & vbCrLf & "Zeit schreiben: " & tsWrite.TotalSeconds & " sec" & vbCrLf & "Speed schreiben : " & FileSize / 1024 / tsWrite.TotalSeconds & " KB/sec" & vbCrLf & "Speed gesamt : " & FileSize / 1024 / (tsRead.TotalSeconds + tsWrite.TotalSeconds) & " KB/sec", "Erfolgreich!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
              
                  Catch ex As Exception
                    MessageBox.Show("Es ist ein Fehler aufgetreten: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
                  End Try
              Mir normalem Text funktioniert folgende Zeile:

              Code:
               docWord.Range.InsertAfter("Dies ist mein Text")
              'Funktioniert
              
                 docWord.Range.InsertAfter(System.Text.Encoding.Default.GetString(RawData, 0, CType(FileSize, Integer)))
              'dies gibt nur so was: ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
              aber mit dem ByteArray nicht...

              ...hat jemand noch ne Idee...?

              Comment


              • #8
                Originally posted by M Merlin View Post
                Es scheint doch zugehen...
                Quäl' Dich nicht weiter damit. Es ist aussichtslos.

                Comment

                Working...
                X