Bild in Datenbank speichern

Beutel2008

Mitglied
So nach dem ich jetzt das halbe Internet durchsucht habe und keine ander Lösung finde müsst Ihr mir mal helfen.

Ich möchte ein Bild Binär in eine MSSQL Datenbank speichern

Habe das bild per MemoryStream in ein Array gefühlt
Code:
       Dim streamsource As New IO.MemoryStream
        'image in memorystream speichern
        PictureBox.Image.Save(streamsource, ImageFormat.Jpeg)

        Dim bytes() As Byte = streamsource.ToArray()

Nun meine Frage wie muss ich den SQL-String zusammenbauen das ich ihn über Command und DataReader abfeuern kann?

Code:
            Dim command As New OleDbCommand(SqlString, connection)
            Dim Reader As OleDbDataReader = command.ExecuteReader()


Vielen Dank und Grüße
Beutel
 
...ExecuteReader? ExecuteNonQuery eher - Du willst doch ein Insert machen, oder? Wenn ja:

Du nimmst einfach deine Insert-Query, z.B. so

Code:
INSERT INTO files (fileID, fileData) VALUES (@fileID, @fileData)

...und fügst dann deinem DbCommand-Object die entsprechenden Parameter hinzu. Dabei kannst du den DbParameter fileData direkt mit dem ByteArray füttern und das ganze dann gegen die Datenbank feuern
 
Zuletzt bearbeitet:
Gut das hatte ich auch schon probiert

Code:
Dim insertsql As String = "INSERT INTO BilderFehler" & _
             " ([Fehler ID], [BildAsBinary])" & _
            " VALUES (@id,@bild)"
        '
        'Datenbankverbindung
        Dim myconn As OleDbConnection = Me.getConnection("MSSQL")

        Try

            'OLDB Command
            Dim insertcmd As New OleDbCommand(insertsql, myconn)
            '
            'Parameter zum Oldb Command hinzufügen und Wert zuweisen
            insertcmd.Parameters.Add("@id", OleDbType.Integer).Value = Fehler_ID
            insertcmd.Parameters.Add("@bild", OleDbType.Binary).Value = Puffer

            '
            ' Datenbankverbindung öffnen
            myconn.Open()
            '
            'Daten in die Datenbank schreiben
            insertcmd.ExecuteNonQuery()

So kommt folgende Fehlermeldung: "Die "@id"-Skalarvariable muss deklariert werden."
 
So Fehler behoben Man muss anstatt
Code:
" VALUES (@id,@bild)"
Code:
" VALUES (?)"
machen und dann klappt es Aber nächstes Problem

Code:
 insertcmd.Parameters.Add("@P1", OleDbType.Binary).Value = Puffer
Wobei puffer ein ByteArray ist und es kommt folgende Fehlermeldung:Operandentypkollision: image ist inkompatibel mit text

Woher weißt der noch das es ein Bild ist es ist doch im Bytearray aufgeschlüsselt?
 
"Der" weiß das nicht, das solltest du wissen. Am besten speicherst du dir den Mime-Type oder die Extension mit von dem was du in die DB schreibst. Das ersparrt dir in der Zukunft einiges an Arbeit...
 
Naja rein Theoretisch ist die Datei doch dann dort in Binäry abgespeichert und ich weiß das es ein JPEG ist und damit kann ich es einfach in eine Picturbox laden. Von daher ist mir die Extension doch egal.

Aber hast du mal ein Code Beispiel mit dem MIME-Typ das verstehe ich nicht

Gruß Beutel
 
So lange deine Dateien immer nur Bilder sind und die durch eine PictureBox reinkommen, ists OK. Wenn du aber irgendwann anfängst andere Dateien (doc, xls, etc...) in die gleiche Tabelle zu speichert, hast du schnell die Übersicht verloren.

Du kannst dir den MimeType anhand der Datei-Extension aus der registry holen. Wie das geht hab ich hier mal aufgeschrieben
 
Okay beantwortet aber immer noch nich mein Problem das er beim Speichern des Bytearrays rummäckert.

folgende Fehlermeldung:Operandentypkollision: image ist inkompatibel mit text
wenn man die
Code:
ExecuteNonQuery
abfeuert.
 
Das schaut so aus als würdest du das Byte-Array in ein Textfeld in der Tabelle schieben wollen.

Ist die Tabelle richtig aufgebaut?

Ich hab keine Ahnung wie das Parametertechnisch mit dem OleDBCommand ausschaut, aber lass doch mal das OleDBType.Binary weg
 
Zurück