none
PDF Datei aus Datenbank lesen und speichern funktinoiert nicht RRS feed

  • Frage

  • Hallo,

    ich habe zu diesem Thema schon etliche Foren Einträge gelesen, schaffe es aber nicht das richtige zu finden.

    Ich habe PDf Dateien in einer SQL Datenbank (SQl Server 2008 R2) in einem Varbinary (Max) Feld. Über ein Web Anwendung kann ich per klick auf einen Link mit dem folgenden Code die Datei ohne Probleme auslesen und anzeigen lassen:

       '    ' Auslesen aus Datenbank
                Dim id As String = CType(Context.Request.QueryString("ID"), String)
                Dim xFilename As String = (Context.Request.QueryString("File"))
    
    
                Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("ITIS_DOCConnectionStringFiles").ConnectionString)
                    Using cmd As New SqlCommand("SELECT ITIS_DocDB_Document FROM ITIS_DocDB WHERE ITIS_DocDB_GUID = @id", conn)
                        cmd.Parameters.AddWithValue("@id", id)
                        conn.Open()
                        Dim myData As Data.SqlClient.SqlDataReader = cmd.ExecuteReader
                        If myData.Read Then
                            With Context.Response
                                .Clear()
                                '.ContentType = "Application/pdf"
                                .AddHeader("Content-Disposition", "inline;filename=" & xFilename)
                                Dim buf(127) As Byte
                                Dim p = myData.GetOrdinal("ITIS_DocDB_Document")
                                Dim l0 = 0&
                                Dim l1 = myData.GetBytes(p, 0, buf, 0, buf.Length)
                                While l1 > 0
                                    .OutputStream.Write(buf, 0, CType(l1, Integer))
                                    l0 += l1
                                    l1 = myData.GetBytes(p, l0, buf, 0, buf.Length)
                                End While
                                .OutputStream.Close()
                            End With
                        End If
                        conn.Close()
                    End Using
                End Using

    Nun muss ich viele der Dateien auf einmal zurücksichern. Ich habe dazu einige Sachen ausprobiert (z.B.)

     Dim cn As New SqlConnection("Data Source=xxx;Initial Catalog=ITIS_DOC;User Id=xxx;Password=xxxx")
            Dim cmd As New SqlCommand("SELECT ITIS_DocDB_Document_Anhang from  ITIS_Doc_Overview_Web_v WHERE ITIS_DocDB_GUID = '" & xid & "'", cn)
    
            'cmd.Parameters.AddWithValue("@ITIS_DocDB_Document_Anhang", DocName)
    
            cn.Open()
    
            Using dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
                If dr.Read() Then
                    Dim fs As IO.FileStream = New IO.FileStream(IO.Path.Combine("E:\invoice\", DocName), IO.FileMode.Create)
                    Dim b() As Byte = dr.Item("ITIS_DocDB_Document_Anhang")
                    fs.Write(b, 0, b.Length)
                    fs.Close()
                End If
            End Using 'dr
    
            cn.Close()

    und auch:

    Dim m_conn As New SqlConnection("Server=xxxxx;Database=ITIS_DOCDB_49C7F727_4CE2_4C88_8DD5_F603FE0CD5FE;Connection Timeout=6000;User id=xxx;Password=xxxxx;")
    
            Dim commGetBlob As New SqlCommand("Select ITIS_DocDB_Document_Anhang from ITIS_DocDB where ITIS_DocDB_GUID = '" & xGUID & "'", m_conn)
            Dim fs As FileStream
    
            Try
                m_conn.Open()
                'Explizite Konvertierung von Object zu Byte()
                Dim arrGetBlob() As Byte = CType(commGetBlob.ExecuteScalar(), Byte())
    
                fs = New FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write)
                Dim bw As New BinaryWriter(fs)
                bw.Write(arrGetBlob)
                bw.Flush()
                bw.Close()
                arrGetBlob = Nothing
                bw = Nothing
            Catch ex As Exception
                Stop
            Finally
                m_conn.Close()
                fs = Nothing
                GC.Collect()
            End Try

    Aber was ich auch tue, die ausgelesene PDF Datei ist immer nur 3 KB groß und kann nicht angezeigt werden. Hat jemand eine Idee? Ich weiß nicht mehr weiter.

    Vielen Dank

    Ulli

    Montag, 8. Dezember 2014 07:39

Antworten

  • Hi Ulli,
    Dein Code sollte eigentlich funktionieren. Um auszuschließen, dass die pdf-Dokumente in der Datenbank falsch abgelegt wurden, solltest Du den Code mal mit einem File-Stream in eine Datei anstelle einer Ausgabe in den Response-Stream testen. Wenn sich die gespeicherte Datei öffnen lässt, dann ist die Ablage in der Datenbank ok und die Ursache liegt im ASP-Bereich.

    In meiner Lösung wird mit "SELECT Pdf FROM DMNews WHERE IDn=@id" und ExecuteScalar das ByteArray gelesen und dann mit folgendem Code in einem Rutsch in den Response-Stream geschrieben:

        Dim buf = GetPdf(id)
        If buf IsNot Nothing AndAlso buf.Length > 0 Then
          context.Response.Clear()
          context.Response.ContentType = "application/pdf"
          context.Response.AppendHeader("Content-Disposition", "inline;filename=Zusatzinfo.pdf")
          Dim ms As New IO.MemoryStream(buf)
          ms.WriteTo(context.Response.OutputStream)
          context.Response.End()
        End If

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 10. Dezember 2014 05:08

Alle Antworten

  • Hallo Ulli,

    Es könnte sein, dass die Übertragung einer beträchtlichen Dateigröße eine Transaktion erfordern wird.

    Siehe dazu:
    FILESTREAM MVC: Download and Upload images from SQL Server (Code in C#)
    Open File Stream Win API
    Accessing File-Stream Data Methods (T-SQL and Managed API)

    Gruß,
    Dimitar

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 9. Dezember 2014 07:31
    Administrator
  • Hi Ulli,
    Dein Code sollte eigentlich funktionieren. Um auszuschließen, dass die pdf-Dokumente in der Datenbank falsch abgelegt wurden, solltest Du den Code mal mit einem File-Stream in eine Datei anstelle einer Ausgabe in den Response-Stream testen. Wenn sich die gespeicherte Datei öffnen lässt, dann ist die Ablage in der Datenbank ok und die Ursache liegt im ASP-Bereich.

    In meiner Lösung wird mit "SELECT Pdf FROM DMNews WHERE IDn=@id" und ExecuteScalar das ByteArray gelesen und dann mit folgendem Code in einem Rutsch in den Response-Stream geschrieben:

        Dim buf = GetPdf(id)
        If buf IsNot Nothing AndAlso buf.Length > 0 Then
          context.Response.Clear()
          context.Response.ContentType = "application/pdf"
          context.Response.AppendHeader("Content-Disposition", "inline;filename=Zusatzinfo.pdf")
          Dim ms As New IO.MemoryStream(buf)
          ms.WriteTo(context.Response.OutputStream)
          context.Response.End()
        End If

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 10. Dezember 2014 05:08
  • Hallo Dimitar, hallo Peter,

    vielen Dank für die Antworten. Mal sehen ob ich da etwas von umsetzen kann. Ich melde mich dann.

    Gruß

    Ulli


    • Bearbeitet Heini2015 Mittwoch, 10. Dezember 2014 11:59
    Mittwoch, 10. Dezember 2014 11:58
  • Hallo Ulli,

    Ich gehe davon aus, dass Du mithilfe von Peters Antwort weitergekommen bist. Solltest Du noch Rückfragen dazu haben, gib uns bitte Bescheid.

    Grüße,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 29. Dezember 2014 07:14
    Administrator
  • Hallo,

    entschuldigt bitte die Zeitverzögerung. Erst mal ein frohes neues Jahr.

    Ja, das hat funktioniert. Vielen Dank für die Hilfe.

    Gruß

    Ulli

    Freitag, 2. Januar 2015 06:59