Zum Inhalt springen

Blob speichern mit ODBC


PowerLooser

Empfohlene Beiträge

Hallo Leute ich bin neu auf dem Board und habe ein Problem.

Seit kurzer Zeit beschäftige ich mich mit VB.net 2008 (VisualStudio).

Bisher habe ich mich mit php, VB6 etc. beschäftigt.

Nun zu meinem Problem...

Ich habe eine Oracle Datenbank und möchte hier ein Datenfeld nutzen um einen Blob zu speichern. Meine Datentabelle heißt "Dokumente" und hier sind die Felder "Datengröße, Dateiname und Dokumentenname (Blobfeld eingerichtet) eingerichtet. Nun möchte ich aus meinem Verzeichnis... "D:\ ...." eine Textdatei z.B. "test.doc" im Blobfeld abspeichern. Ich habe hierzu bereits meine Quellcode geschrieben und bekomme immer die Meldung: "Die angegebene Umwandlung ist ungültig!"

Vielleicht kann mir jemand helfen... im Inet habe ich selbstverständlich schon dieses Thema durch gegooglet und nix in meinem Berdch gefunden. Oft sind Accesdatenbanken... oder Quellcode die ebenfalls nciht funktionieren...

Hier mein Quellcode...

Dim con As New Odbc.OdbcConnection

Dim cmd As New Odbc.OdbcCommand

Dim trans As Odbc.OdbcTransaction

Dim FileSize As UInt32

Dim rawData() As Byte

Dim fs As FileStream

Dim sql As String

Dim strFileName As Object

strFileName = "D:\"

con.ConnectionString = _

"FILEDSN=Meine Datenbank;UID=PLA;PWD=PLA;Connection Timeout=6000"

cmd.Connection = con

Try

fs = New FileStream("D:\Test.doc", FileMode.Open, FileAccess.Read)

FileSize = fs.Length

rawData = New Byte(FileSize) {}

fs.Read(rawData, 0, FileSize)

fs.Close()

con.Open()

trans = con.BeginTransaction

cmd.Transaction = trans

'SQL = "INSERT INTO Dokumente VALUES(NULL, ?FileName, ?FileSize, ?File)"

sql = "INSERT INTO Dokumente VALUES(NULL, Dateiname, Dateigröße, Dokumentenname)"

cmd.Connection = con

cmd.CommandText = SQL

cmd.Parameters.Add("Dateiname", strFileName)

cmd.Parameters.Add("Dateigröße", FileSize)

cmd.Parameters.Add("Dokumentenname", rawData)

cmd.ExecuteNonQuery()

trans.Commit()

MsgBox("Daten übertragen!")

con.Close()

Catch ex As Exception

MessageBox.Show("Blob konnte nicht erstellt werden: " & ex.Message, "Error", _

MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe jetzt mal den Quellcode von TDM eingebunden... :rolleyes:

Dazu habe ich auch mein Quellcode noch etwas abgewandelt um vielleicht den Fehler zu finden...

Allerdings bekomme ich nach wie vor meine Meldung ... ""Die angegebene Umwandlung ist ungültig!"

"

Vielleicht kann jemand hier im Quellcode den Fehler entdecken.

Aber wie gesagt bin ich auf Oracle und ODBC angewiesen. Die Sache mit den Blob's ist allerdings notwendig, da es in ein Dokumentenmanagement eingebunden werden soll. Speicherplatz auf dem Server ist mit mehreren Terryabyte kein Problem :upps

Dim con As New Odbc.OdbcConnection

Dim cmd As New Odbc.OdbcCommand

Dim trans As Odbc.OdbcTransaction

Dim FileSize As UInt32

Dim fs As FileStream

Dim sql As String

Dim strFileName As Object

'Dim Puffer() As Byte = GetBytesFromFile("D:\Personal.gif")

strFileName = "D:\"

con.ConnectionString = _

"FILEDSN=Meine Datenbank;UID=PLA;PWD=PLA;Connection Timeout=6000"

cmd.Connection = con

Try

fs = New IO.FileStream("D:\Personal.gif", FileMode.Open, FileAccess.Read)

Dim reader As BinaryReader = New BinaryReader(fs)

Dim Data As Byte() = reader.ReadBytes(DirectCast(fs.Length, Long))

FileSize = fs.Length

reader.Close()

con.Open()

trans = con.BeginTransaction

cmd.Transaction = trans

sql = "INSERT INTO Blobfeld VALUES(?Id, ?FileName, ?FileSize, ?File)"

cmd.Connection = con

cmd.CommandText = sql

cmd.Parameters.AddWithValue("?Id", "100")

cmd.Parameters.AddWithValue("?Filename", strFileName)

cmd.Parameters.AddWithValue("?Filesize", FileSize)

cmd.Parameters.AddWithValue("?File", CType(Data, Byte()))

MsgBox(sql)

cmd.ExecuteNonQuery()

trans.Commit()

MsgBox("Daten übertragen!")

con.Close()

Catch ex As Exception

MessageBox.Show("Blob konnte nicht erstellt werden: " & ex.Message, "Error", _

MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

End Sub

Bearbeitet von PowerLooser
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nach langem grübeln un detwas Schweiß habe ich nun doch noch des Rätsels Lösung gefunden!

Wer mit ODBC, VB.net (2008) etc. und Oracledatenbank arbeitet, kann meinen Quellcode gerne benutzen

Datenbanktabelle: Blobfeld

Felder: ID, Pfad, length, Bild (Bild als Blob)

Es funktioniert das speichern des Blobs und auslesen!!!


Imports System.Data

Imports System.Data.SqlClient

Imports System.IO

Imports System.Drawing.Imaging

Imports System.Data.Odbc

Imports System.Data.Odbc.OdbcDataAdapter


Public Class BlobDatenbank


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click


        Dim con As New Odbc.OdbcConnection

        Dim cmd As New Odbc.OdbcCommand

        Dim trans As Odbc.OdbcTransaction

        Dim FileSize As UInt32

        Dim Pfad As String

        Dim anzahl As Integer


        Pfad = "D:\Personal.gif"



        Dim fs As New IO.FileStream(Pfad, IO.FileMode.OpenOrCreate, IO.FileAccess.Read)

        Dim iLen As Integer = CInt(fs.Length)

        Dim bBLOBStorage(iLen) As Byte

        fs.Read(bBLOBStorage, 0, iLen)

        FileSize = fs.Length

        fs.Close()


        con.ConnectionString = _

            "FILEDSN=Meine Datenbank;UID=PLA;PWD=PLA"

        cmd.Connection = con


        con.Open()


        Try

            trans = con.BeginTransaction

            cmd.Transaction = trans



            cmd.CommandText = _

                "INSERT INTO Blobfeld (ID, Pfad, length, Bild) VALUES (?, ?, ?, ?)"


            cmd.Parameters.Add("?ID", Odbc.OdbcType.VarChar).Value = "100"

            cmd.Parameters.Add("?DN", Odbc.OdbcType.VarChar).Value = Mid(Pfad, InStrRev(Pfad, "\") + 1)

            cmd.Parameters.Add("?LD", Odbc.OdbcType.VarChar).Value = FileSize

            cmd.Parameters.Add("?DA", Odbc.OdbcType.VarBinary).Value = bBLOBStorage



            anzahl = cmd.ExecuteNonQuery()

            If anzahl > 0 Then

                MsgBox("Es wurde ein Datensatz neu angelegt", _

                MsgBoxStyle.Information, "Info")

            End If

            trans.Commit()

            con.Close()


        Catch ex As Exception


            trans.Rollback()

            MsgBox(ex)


        End Try


    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim conn As New Odbc.OdbcConnection

        Dim cmd As New Odbc.OdbcCommand

        Dim myData As Odbc.OdbcDataReader


        Dim SQL As String

        Dim rawData() As Byte

        Dim FileSize As Int32

        Dim fs As FileStream


        conn.ConnectionString = _

            "FILEDSN=Meine Datenbank;UID=PLA;PWD=PLA"

        cmd.Connection = conn


        conn.Open()



        SQL = "select * from Blobfeld"



        Try


            cmd.Connection = conn

            cmd.CommandText = SQL


            myData = cmd.ExecuteReader()

            Do While myData.Read()

                If Not myData.HasRows Then Throw New Exception("Es sind keine Blobs vorhanden")


                'myData.Read()


                Me.ListBox1.Items.Add(myData("Pfad"))



                FileSize = myData.GetInt32(myData.GetOrdinal("length"))

                rawData = New Byte(FileSize) {}


                myData.GetBytes(myData.GetOrdinal("Bild"), 0, rawData, 0, FileSize)


                fs = New FileStream("D:\neueCopy.gif", FileMode.OpenOrCreate, FileAccess.Write)

                fs.Write(rawData, 0, FileSize)

                fs.Close()


                MessageBox.Show("Datei wurde neu erstellt!")

            Loop


            myData.Close()

            conn.Close()

        Catch ex As Exception

            MessageBox.Show("Fatal Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try


    End Sub


End Class

Das mit ODBC und Oracle ist schon etwas kompliziert :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Frage zu deiner INSERT-Anweisung:

Du vergibst deine ID nicht dynamisch, oder irre ich mich? Wenn du das so nutzt, kommt es unweigerlich zu nem PrimaryKey-Fehler.

Womit erstellst und überwachst du deine Datenbank? Vllt. kannst du dort autoincrement einstellen, wodurch du dir das Feld mit der ID klemmen kannst.

Grüße, der Marci :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Frage zu deiner INSERT-Anweisung:

Du vergibst deine ID nicht dynamisch, oder irre ich mich? Wenn du das so nutzt, kommt es unweigerlich zu nem PrimaryKey-Fehler.

Womit erstellst und überwachst du deine Datenbank? Vllt. kannst du dort autoincrement einstellen, wodurch du dir das Feld mit der ID klemmen kannst.

Grüße, der Marci :D

Ich nutze hierzu eine eigene Registrierung und mein Feld in der Datenbank heißt nur ID. Außerdem brauche ich einen gesonderten Datenschlüssel der für mich noch weitere Daten zurück gibt, wodurch ich mir zwei Datenbankfelder sparen kann! :uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...