Binär Speicherung / Wiederherstellung Accsess-Datenbank

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Binär Speicherung / Wiederherstellung Accsess-Datenbank

    Hallo

    seit einiger Zeit verwalte ich meine Daten in Datenbanken. Bisher habe ich in der Datenbank aber nur einen Datenlink zu der entsprechenden Datenquelle gespeichert. Da die ganze Geschichte nun sehr umfangreich wird, habe ich mich dazu entschlossen, die Datenquelle nicht mehr zu verlinken, sondern sie binär in die Datenbank aufzunehmen. Diese Vorgehensweise schafft sicherlich eine bessere Übersicht auf der Festplatte und erleichtert auch die Datensicherung. Es handelt sich um unterschiedliche Dateiformate (excel, word, pdf, jpg, mp3). Nun bin ich auf der Suche nach einheitlichen Funktionen/Prozeduren die dieses bewerkstelligen können. Bilddateien kann ich umwandeln und auch binär speichern. Hänge nun an der Wiederherstellung fest.

    Bild umwandeln

    VB.NET-Quellcode

    1. Public Function bildanzeigen(ByVal strfile As String) As Image
    2. Dim fs As FileStream = New FileStream(strfile, FileMode.Open)
    3. Try
    4. myfilelength = fs.LengthReDim Puffer(myfilelength - 1)
    5. fs.Read(Puffer, 0, myfilelength)Dim b As Bitmap = New Bitmap(New MemoryStream(Puffer))
    6. Return bCatch ex As Exception
    7. Finally
    8. fs.Close()
    9. End Try
    10. End Function



    Bild in Datenbank aufnehmen

    VB.NET-Quellcode

    1. Public Function bildspeichern(ByVal ID As Int32) As Image
    2. cmd.CommandText = "INSERT INTO Test" & _" (FN1, FN2, FN3, FN4, FN5)" & _" VALUES (@ai,@nu,@dn,@length,@bild)"
    3. Try
    4. Dim insertcmd As New OleDbCommand(cmd.CommandText, con)
    5. insertcmd.Parameters.Add( _
    6. "@ai", OleDbType.Char).Value = "A"
    7. insertcmd.Parameters.Add( _
    8. "@nu", OleDbType.Char).Value = "100"
    9. insertcmd.Parameters.Add( _"@dn", OleDbType.Char).Value = Bilddatei
    10. insertcmd.Parameters.Add( _"@length", OleDbType.Integer).Value = Puffer.Length
    11. insertcmd.Parameters.Add( _"@bild", OleDbType.Binary).Value = Puffer
    12. con.Open()
    13. insertcmd.ExecuteNonQuery()
    14. Catch ex As Exception
    15. MessageBox.Show(ex.Message.ToString)
    16. Finally
    17. con.Close()
    18. End Try
    19. End Function



    Datensatz lesen / Bilddatei auf der Festplatte wiederherstellen (hier komme ich nicht weiter)

    VB.NET-Quellcode

    1. Public Function Bild_Wiederherstellen(ByVal AIndex As String, ByVal BIndex As String, ByVal DTab As String) As Image
    2. Try
    3. If BIndex = "" Then cmd.CommandText = "Select * from " & DTab & " where FN1 like '" & AIndex & "'"If BIndex <> "" Then cmd.CommandText = "Select * from " & DTab & " where FN1 like '" & AIndex & "'" _
    4. & "and FN2 like '" & BIndex & "'"
    5. con.Close()
    6. con.Open()
    7. reader = cmd.ExecuteReaderDo While reader.Read
    8. DLES(1) = reader("FN1")
    9. DLES(2) = reader("FN2")
    10. DLES(3) = reader("FN3")
    11. Lang = reader("FN4")
    12. Repuffer = reader("FN5")
    13. Loop
    14. con.Close()Dim Ausgabedatei As String = DLES(3)
    15. Catch ex As Exception
    16. MsgBox(ex.Message)
    17. End Try
    18. End Function



    Schön wäre es eine Vorgehensweise für alle Dateiarten zu haben (Excel, Word usw.).
    Gruß Markus

    Westerwälder schrieb:

    Da die ganze Geschichte nun sehr umfangreich wird, habe ich mich dazu entschlossen, die Datenquelle nicht mehr zu verlinken, sondern sie binär in die Datenbank aufzunehmen.

    EIGENTLICH ist die "alte" Verwaltung besser, da man ansonsten die Datenbank ziemlich aufbläht.

    ansonsten kannst du natürlich jede Datei einfach in einen Stream einlesen und diese Bytes dann in der DB speichern. Der Dateityp spielt dann keine Rolle.

    bsp: codeproject.com/KB/database/AccessBlob.aspx
    Danke, ich habe mir den Code angeschaut.

    Der Aufbau ist doch etwas anders als der meinige bisherige. Benötige nur den Codeschnippsel wie ich aus der Variable RePuffer meine Datei wieder auf der Festplatte speichern kann. Im Grunde, wenn ich das nun richtig verstanden habe, können meine Functionen dann auch andere Datenformate bearbeiten.
    Gruß Markus
    Ich regle das ganze bei mir in den Datenbanken in dem ich die Datei in einen Base64-String umwandle und dann ganz einfach in der Datenbank speichern kann.
    Zum speichern der Datei kann man es einfach wieder in eine Datei umwandeln.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia

    Westerwälder schrieb:

    das dies in einer schleife erfolgt ist mir schon klar aber wie sieht diese aus?

    Um irgendeinen Byte"stream" (oder array etc) in Base64 zu wandeln, brauchts keine Schleife ...

    VB.NET-Quellcode

    1. Private Sub foo()
    2. Dim b(10) As Byte
    3. b(10) = 5
    4. ' mach base64
    5. Dim b64 As String = Convert.ToBase64String(b)
    6. ' und wieder zurück zu byte
    7. Dim c() As Byte = Convert.FromBase64String(b64)
    8. End Sub
    Das Programm läuft nun nach deinem Rat. Leider sind die wiederhergestellten Dateien nicht mehr lesbar. (Versuch mit .jpg und .xls durchgeführt). Die Bilddatei wird von win 7 gar nicht geöffnet, die exceldatei enthält irgendwelche Daten die nichts mit der Originaldatei zu tun haben. Hänge den kompletten Code nochmals an.

    VB.NET-Quellcode

    1. Imports System.Data
    2. Imports System.Data.OleDbImports System.IO
    3. Public Class Binr
    4. Inherits System.Windows.Forms.Form
    5. Private Puffer() As Byte
    6. Dim strfrile As StringDim myfilelength As Int64
    7. Dim Lang As Int64
    8. Dim Repuffer() As BytePublic
    9. Sub Dateiquelle_Einlesen(ByVal QuellDatei As String)
    10. Using br As New System.IO.BinaryReader(New System.IO.FileStream(QuellDatei, IO.FileMode.Open))
    11. Puffer = br.ReadBytes(br.BaseStream.Length)
    12. br.Close()
    13. End Using
    14. End Sub
    15. Public Sub Dateiquelle_BinrSpeichern(ByVal Dtab As String)
    16. cmd.CommandText = "INSERT INTO " & Dtab & _
    17. " (FN01, FN02, FN03, FN04, FN05)" & _
    18. " VALUES (@ai,@nu,@dn,@length,@bild)"
    19. Try
    20. Dim insertcmd As New OleDbCommand(cmd.CommandText, con)
    21. insertcmd.Parameters.Add( _
    22. "@ai", OleDbType.Char).Value = "A"
    23. insertcmd.Parameters.Add( _
    24. "@nu", OleDbType.Char).Value = "100"
    25. insertcmd.Parameters.Add( _"@dn", OleDbType.Char).Value = Bilddatei
    26. insertcmd.Parameters.Add( _"@length", OleDbType.Integer).Value = Puffer.Length
    27. insertcmd.Parameters.Add( _"@bild", OleDbType.Binary).Value = Puffer
    28. con.Open()
    29. insertcmd.ExecuteNonQuery()
    30. Catch ex As Exception
    31. MessageBox.Show(ex.Message.ToString)
    32. Finally
    33. con.Close()
    34. End Try
    35. End Sub
    36. Public Sub DateiBinr_Wiederherstellen(ByVal AIndex As String, ByVal BIndex As String, ByVal DTab As String)
    37. Try
    38. If BIndex = "" Then cmd.CommandText = "Select * from " & DTab & " where FN01 like '" & AIndex & "'"If BIndex <> "" Then cmd.CommandText = "Select * from " & DTab & " where FN01 like '" & AIndex & "'" _
    39. & "and FN02 like '" & BIndex & "'"
    40. con.Close()
    41. con.Open()
    42. reader = cmd.ExecuteReaderDo While reader.Read
    43. DLES(1) = reader("FN01")
    44. DLES(2) = reader("FN02")
    45. DLES(3) = reader("FN03")
    46. Lang = reader("FN04")
    47. Repuffer = reader("FN05")
    48. Loop
    49. con.Close()
    50. Dim datinhalt As String = Convert.ToBase64String(Repuffer)My.Computer.FileSystem.WriteAllText(ZielDatei, datinhalt, True)
    51. Catch ex As Exception
    52. MsgBox(ex.Message)
    53. End Try
    54. End Sub
    55. End Class
    Gruß Markus

    VB.NET-Quellcode

    1. 'Datei in Base64:
    2. Dim Base64 As String = Convert.ToBase64String(File.ReadAllBytes(Quelldatei))
    3. 'Base64 in Datei:
    4. File.WriteAllBytes(Zieldatei, Convert.FromBase64String(Base64))
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Du sollst ja auch nicht das Bytearray sondern den String in der Datenbank speichern.
    In dem Beispiel von mir, speicherst du die Variable Base64 in der Datenbank.
    Zum "zurückspeichern" zur Datei nimmst du den Inhalt der Spalte, in der du den String gespeichert hast und gibst diesen Inhalt beim Beispiel "Base64 in Datei" als Base64 an.

    Hast du auch in der Datenbank den Spaltetyp geändern, sofern dieser Byte oder Blob oder ähnliches war?
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    So habe die Änderung in übernommen. Nun erscheint die Fehlermeldung Datentypen in Kriterienausdruck unverträglich. Den Feldtyp der Datenbank habe ich nun auf Text gesetzt. Ich arbeite mit Office 2000. Vielleicht liegt es auch daran.
    Gruß Markus

    Westerwälder schrieb:

    Den Feldtyp der Datenbank habe ich nun auf Text gesetzt

    Dürfte zu klein sein. Selbst "Memo" fasst nur 64k. Nur "Ole Object" wäre groß genug, aber das hat wieder andere Nachteile.
    Access ist halt nicht dafür gedacht, solcherart "Binärdaten" einfach zu speichern. "Richtige" Datenbanken kennen für sowas normalerweise den "BLOB" (Binary Large Object)