PowerLooser Geschrieben 4. Mai 2009 Geschrieben 4. Mai 2009 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 Zitieren
TDM Geschrieben 4. Mai 2009 Geschrieben 4. Mai 2009 Eigentlich sollte das helfen: BLOB into database using ODBC Als Anmerkung nochmal das: ACC: Reading, Storing, & Writing Binary Large Objects (BLOBs) Wenn beides nicht geht, halt auf OCI umsteigen (ja, ich mags auch nicht). Zitieren
PowerLooser Geschrieben 4. Mai 2009 Autor Geschrieben 4. Mai 2009 Eigentlich sollte das helfen: BLOB into database using ODBC Als Anmerkung nochmal das: ACC: Reading, Storing, & Writing Binary Large Objects (BLOBs) Wenn beides nicht geht, halt auf OCI umsteigen (ja, ich mags auch nicht). thx für deine schnelle Antwort :-) ich ziehe mit die blob's mal rein!!!! :old Zitieren
PowerLooser Geschrieben 6. Mai 2009 Autor Geschrieben 6. Mai 2009 (bearbeitet) Ich habe jetzt mal den Quellcode von TDM eingebunden... 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 6. Mai 2009 von PowerLooser Zitieren
PowerLooser Geschrieben 7. Mai 2009 Autor Geschrieben 7. Mai 2009 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 Zitieren
Vandahil Geschrieben 14. Mai 2009 Geschrieben 14. Mai 2009 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 Zitieren
PowerLooser Geschrieben 14. Mai 2009 Autor Geschrieben 14. Mai 2009 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 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 Zitieren
PowerLooser Geschrieben 14. Mai 2009 Autor Geschrieben 14. Mai 2009 Kein Prob... :floet: Könntest mein Sohn sein, der paßt auch immer auf seinen Dad auf! Zitieren
Vandahil Geschrieben 14. Mai 2009 Geschrieben 14. Mai 2009 Seltsam.. laut Nachname könnte ich der echt sein (b²t) && (sry 4 spam) Zitieren
Empfohlene Beiträge
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.