none
MSSQL Image Speichern RRS feed

  • Frage

  • Ich habe das Problem das laut Microsoft die MSSQL Datenfelder IMAGE,VARBINARY(MAX) bis zu 2GB speichern können bei mir aber egal was ich mache maximal 220 kb drin sind. Bei allem was größer ist bekomme ich die Antwort dass die Daten abgeschnitten würden.

    Ziel ist es Dokumente oder Bilder zu speichern.

    Ja Filestream kenne ich aber es ist wenig sinnvoll zwei verschiedene weg zu gehen nur weil die Größe zwischen 100kb und 1mb variiert.

    Des Weiteren handelt es sich nicht um eine Webanwendung sodass sich lange Ladezeiten eh nicht ereignen.

    Was ist das eigentliche Problem daran muss ich am Server etwas einstellen damit solch langen Daten übertragen werden.

    Ich habe nun etliche VB.net Codes ausprobiert die Daten formatiert in etlichen formen das ich mit Gewissheit sagen kann das, dass Problem Serverseitig sein muss.

    Freitag, 25. November 2011 09:47

Antworten

  •  Private Sub dokupload()
            Try
                Dim cmd As New SqlCommand("INSERT INTO Dokumente (DOK,Beschreibung) VALUES (@BLOBData,@Bes)", HIS_Vtool.con)
                Dim strBLOBFilePath As String = dateiname1 '"D:\Bilder\zeug\biohazard-uncivilization.jpg"
                Dim fsBLOBFile As New FileStream(strBLOBFilePath, FileMode.Open, FileAccess.Read)
                Dim bytBLOBData(Convert.ToInt32(fsBLOBFile.Length)) As Byte
                Dim databuffer As Byte() = File.ReadAllBytes(strBLOBFilePath)
    
                fsBLOBFile.Read(bytBLOBData, 0, Convert.ToInt32(bytBLOBData.Length))
                fsBLOBFile.Close()
    
                cmd.Parameters.Add(New SqlClient.SqlParameter("@BLOBData", SqlDbType.VarBinary, databuffer.Length, "DOK"))
                cmd.Parameters(0).Value = bytBLOBData
                cmd.Parameters.Add(New SqlClient.SqlParameter("@Bes", SqlDbType.VarChar, 50, "Beschreibung"))
                cmd.Parameters(1).Value = strBLOBFilePath
                cmd.ExecuteNonQuery()
    
            Catch exsql As SqlException
                HIS_Vtool.RichTextBox1.SelectionColor = IndianRed
                HIS_Vtool.RichTextBox1.AppendText("Dokument upload fehlgeschlagen SQL fehler. " & exsql.Message & " – ")
                HIS_Vtool.RichTextBox1.ScrollToCaret()
                HIS_Vtool.Log_file("Dokument upload fehlgeschlagen SQL fehler. " & exsql.Message & " – ")
            Catch ex As Exception
                HIS_Vtool.RichTextBox1.SelectionColor = IndianRed
                HIS_Vtool.RichTextBox1.AppendText("Dokument upload fehlgeschlagen APP fehler. " & ex.ToString & " – " & ex.Message)
                HIS_Vtool.RichTextBox1.ScrollToCaret()
                HIS_Vtool.Log_file("Dokument upload fehlgeschlagen APP fehler. " & ex.ToString & " – " & ex.Message)
            End Try
        End Sub
    


    Ok jetzt gehts er importiert mir jetzt alles jpg doc pdf super danke danke!!

    werde noch nin paar tests machen und dann denke ich das dieser code die lösung ist.

     

    • Als Antwort markiert aktony Freitag, 2. Dezember 2011 06:45
    Montag, 28. November 2011 12:11

Alle Antworten

  • Kannst Du vielleicht mal etwas Code posten, mit Du es probiert hast und welcher die Fehlermeldung verursacht hat? Angaben zur verwendeten SQL Server Version sind ebenfalls hilfreich.
    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Freitag, 25. November 2011 10:00
  •     Private Sub ImgUpload()
            Dim cmd As New SqlCommand("INSERT INTO Bilder (Bild,Beschreibung) VALUES (@BLOBData,@Bes)", HIS_Vtool.con)
            Dim strBLOBFilePath As String = dateiname1 '"D:\Bilder\zeug\biohazard-uncivilization.jpg"
            Dim fsBLOBFile As New FileStream(strBLOBFilePath, FileMode.Open, FileAccess.Read)
            Dim bytBLOBData(fsBLOBFile.Length() - 1) As Byte
    
            fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length)
            fsBLOBFile.Close()
    
            Dim prm As New SqlParameter("@BLOBData", bytBLOBData)
            Dim prm1 As New SqlParameter("@Bes", strBLOBFilePath)
    
            cmd.Parameters.Add(prm)
            'cmd.Parameters.Add(New SqlClient.SqlParameter("@BLOBData", SqlDbType.Image, bufferLen, "Bild"))
            'cmd.Parameters(0).Value = bytBLOBData
            cmd.Parameters.Add(prm1)
            cmd.ExecuteNonQuery()
        End Sub
    ''''dann#
      Private Sub dokupload()
            Try
                Dim cmd As New SqlCommand("INSERT INTO Dokumente (DOK,Beschreibung) VALUES (@BLOBData,@Bes)", HIS_Vtool.con)
                Dim strBLOBFilePath As String = dateiname1 '"D:\Bilder\zeug\biohazard-uncivilization.jpg"
                Dim fsBLOBFile As New FileStream(strBLOBFilePath, FileMode.Open, FileAccess.Read)
                Dim bytBLOBData(Convert.ToInt64(fsBLOBFile.Length)) As Byte
    
                fsBLOBFile.Read(bytBLOBData, 0, Convert.ToInt64(bytBLOBData.Length))
                fsBLOBFile.Close()
    
                'Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, False, 0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
                'Dim prm1 As New SqlParameter("@Bes", SqlDbType.VarChar, strBLOBFilePath.Length, ParameterDirection.Input, False, 0, 0, Nothing, DataRowVersion.Current, strBLOBFilePath)
                ' Dim prm As New SqlParameter("@BLOBData", bytBLOBData)
                Dim prm1 As New SqlParameter("@Bes", strBLOBFilePath)
    
                'cmd.Parameters.Add(prm)
                cmd.Parameters.Add(New SqlClient.SqlParameter("@BLOBData", SqlDbType.VarBinary, 2147483647, "DOK"))
                cmd.Parameters(0).Value = bytBLOBData
                cmd.Parameters.Add(prm1)
                cmd.ExecuteNonQuery()
            Catch exsql As SqlException
                HIS_Vtool.RichTextBox1.SelectionColor = IndianRed
                HIS_Vtool.RichTextBox1.AppendText("Dokument upload fehlgeschlagen SQL fehler. " & exsql.Message & " – ")
                HIS_Vtool.RichTextBox1.ScrollToCaret()
                HIS_Vtool.Log_file("Dokument upload fehlgeschlagen SQL fehler. " & exsql.Message & " – ")
            Catch ex As Exception
                HIS_Vtool.RichTextBox1.SelectionColor = IndianRed
                HIS_Vtool.RichTextBox1.AppendText("Dokument upload fehlgeschlagen APP fehler. " & ex.ToString & " – " & ex.Message)
                HIS_Vtool.RichTextBox1.ScrollToCaret()
                HIS_Vtool.Log_file("Dokument upload fehlgeschlagen APP fehler. " & ex.ToString & " – " & ex.Message)
            End Try
        End Sub
    

    so ich habe toint32 ohne diese dann SqlDbType.VarBinary oder image probiert und und und.
    Freitag, 25. November 2011 10:25
  • Windows 2008

    MSSQL 2008 vollversion.


    Dokument upload fehlgeschlagen SQL fehler. Zeichenfolgen- oder Binärdaten würden abgeschnitten.
    Die Anweisung wurde beendet. –
    • Bearbeitet aktony Montag, 28. November 2011 07:18
    Montag, 28. November 2011 07:05
  • Hallo,

    schau Dir mal an: Bilder in einer MS SQL Tabelle ablegen.

    Falls Du Schwierigkeiten haben solltest, den C# Code in VB umzusetzen, sag Bescheid.

    Gruß Elmar

    Montag, 28. November 2011 08:22
    Beantworter
  • jo genau das problem habe ich. besser wäre vieleicht einfach was fehlt bei den von mir verwendeten?

     


    bei mir läuft das ganze in C# nicht benutze vs2010 64bit kann da was mit den libarys fallsch sein.
    • Bearbeitet aktony Montag, 28. November 2011 08:51
    Montag, 28. November 2011 08:50
  • INSERT INTO Bilder(Beschreibung, Bild)
    SELECT '.jpg' AS Beschreibung,
    * FROM OPENROWSET(BULK N'C:\Users\olszynski\Pictures\dsc_0178.jpg',SINGLE_BLOB) AS Bild
    GO

    so jetzt habe ich das ganze mal am Server direkt probiert und sieh da 4mb no problemo?

    liegt das nur am SQL String mh???

    Montag, 28. November 2011 10:22
  • Hallo,

    grundsätzlich sollte man immer die Parameter explizit mit Datentypen versehen,
    was Du oben unterlassen hast, siehe mein Beispiel.

    Was Dir ins Gehege kommen kann ist SET TEXTSIZE, was für alle Blob-Datentypen gilt (und nicht nur Text).
    Weswegen es im allgemeinen gesünder ist, größere Dateien nicht in einem Stück zu übertragen,
    was dann nebenbei auch ressourcenschonender ist, siehe dazu die Chunk Methoden im Beispiel.

    Gruß Elmar

    • Als Antwort vorgeschlagen Falk Krahl Donnerstag, 1. Dezember 2011 11:49
    Montag, 28. November 2011 11:25
    Beantworter
  •  Private Sub dokupload()
            Try
                Dim cmd As New SqlCommand("INSERT INTO Dokumente (DOK,Beschreibung) VALUES (@BLOBData,@Bes)", HIS_Vtool.con)
                Dim strBLOBFilePath As String = dateiname1 '"D:\Bilder\zeug\biohazard-uncivilization.jpg"
                Dim fsBLOBFile As New FileStream(strBLOBFilePath, FileMode.Open, FileAccess.Read)
                Dim bytBLOBData(Convert.ToInt32(fsBLOBFile.Length)) As Byte
                Dim databuffer As Byte() = File.ReadAllBytes(strBLOBFilePath)
    
                fsBLOBFile.Read(bytBLOBData, 0, Convert.ToInt32(bytBLOBData.Length))
                fsBLOBFile.Close()
    
                cmd.Parameters.Add(New SqlClient.SqlParameter("@BLOBData", SqlDbType.VarBinary, databuffer.Length, "DOK"))
                cmd.Parameters(0).Value = bytBLOBData
                cmd.Parameters.Add(New SqlClient.SqlParameter("@Bes", SqlDbType.VarChar, 50, "Beschreibung"))
                cmd.Parameters(1).Value = strBLOBFilePath
                cmd.ExecuteNonQuery()
    
            Catch exsql As SqlException
                HIS_Vtool.RichTextBox1.SelectionColor = IndianRed
                HIS_Vtool.RichTextBox1.AppendText("Dokument upload fehlgeschlagen SQL fehler. " & exsql.Message & " – ")
                HIS_Vtool.RichTextBox1.ScrollToCaret()
                HIS_Vtool.Log_file("Dokument upload fehlgeschlagen SQL fehler. " & exsql.Message & " – ")
            Catch ex As Exception
                HIS_Vtool.RichTextBox1.SelectionColor = IndianRed
                HIS_Vtool.RichTextBox1.AppendText("Dokument upload fehlgeschlagen APP fehler. " & ex.ToString & " – " & ex.Message)
                HIS_Vtool.RichTextBox1.ScrollToCaret()
                HIS_Vtool.Log_file("Dokument upload fehlgeschlagen APP fehler. " & ex.ToString & " – " & ex.Message)
            End Try
        End Sub
    


    Ok jetzt gehts er importiert mir jetzt alles jpg doc pdf super danke danke!!

    werde noch nin paar tests machen und dann denke ich das dieser code die lösung ist.

     

    • Als Antwort markiert aktony Freitag, 2. Dezember 2011 06:45
    Montag, 28. November 2011 12:11
  • Hallo,

    naja wenn Du das schon als "die Antwort" ansiehst ;-),
    so solltest Du den Code mit einer anständigen Fehlerbehandlung versehen.

    Denn es kommt nicht nur darauf an, eine hübsche Fehlermeldung zu produzieren,
    auch der Stream sollte geschlossen werden, sonst hast Du ein Leck.

    Und kommt die Fehlermeldung von SQL Server Seite kommt, so besteht die Möglichkeit,
    dass die (nicht gezeigte) SqlConnection kaputt ist, und nicht weiter genutzt werden kann,
    siehe Schweregrade

    Gruß Elmar

    Freitag, 2. Dezember 2011 10:31
    Beantworter