Benutzer mit den meisten Antworten
PDF Datei aus Datenbank lesen und speichern funktinoiert nicht

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
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- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Dezember 2014 07:14
Alle Antworten
-
Hallo Ulli,
Es könnte sein, dass die Übertragung einer beträchtlichen Dateigröße eine Transaktion erfordern wird.
Siehe dazu:
Gruß,
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)
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.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 9. Dezember 2014 08:03
-
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- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Dezember 2014 07:14
-
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,
DimitarBitte 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.