Du bist nicht angemeldet.

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

1

Montag, 30. August 2010, 09:26

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

Visual Basic Quellcode

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



Bild in Datenbank aufnehmen

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 Public Function bildspeichern(ByVal ID As Int32) As Image 
cmd.CommandText = "INSERT INTO Test" & _" (FN1, FN2, FN3, FN4, FN5)" & _" VALUES (@ai,@nu,@dn,@length,@bild)" 


Try 
Dim insertcmd As New OleDbCommand(cmd.CommandText, con) 
insertcmd.Parameters.Add( _ 
"@ai", OleDbType.Char).Value = "A" 
insertcmd.Parameters.Add( _ 
"@nu", OleDbType.Char).Value = "100" 
insertcmd.Parameters.Add( _"@dn", OleDbType.Char).Value = Bilddatei 
insertcmd.Parameters.Add( _"@length", OleDbType.Integer).Value = Puffer.Length 
insertcmd.Parameters.Add( _"@bild", OleDbType.Binary).Value = Puffer 

con.Open() 
insertcmd.ExecuteNonQuery() 
Catch ex As Exception 
MessageBox.Show(ex.Message.ToString) 
Finally 
con.Close() 
End Try 
End Function



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

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Function Bild_Wiederherstellen(ByVal AIndex As String, ByVal BIndex As String, ByVal DTab As String) As Image 

Try 
If BIndex = "" Then cmd.CommandText = "Select * from " & DTab & " where FN1 like '" & AIndex & "'"If BIndex <> "" Then cmd.CommandText = "Select * from " & DTab & " where FN1 like '" & AIndex & "'" _ 
& "and FN2 like '" & BIndex & "'" 
con.Close() 
con.Open() 
reader = cmd.ExecuteReaderDo While reader.Read 
DLES(1) = reader("FN1") 
DLES(2) = reader("FN2") 
DLES(3) = reader("FN3") 
Lang = reader("FN4") 
Repuffer = reader("FN5") 

Loop 
con.Close()Dim Ausgabedatei As String = DLES(3) 

Catch ex As Exception 
MsgBox(ex.Message) 
End Try 
End Function



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

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

2

Montag, 30. August 2010, 09:51

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: http://www.codeproject.com/KB/database/AccessBlob.aspx
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

3

Montag, 30. August 2010, 10:47

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

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

4

Montag, 30. August 2010, 15:44

Niemand eine Idee für die Umwandlung von Binär zu einer lesenbaren Datei?
Gruß Markus

T1g0r

Registrierter Benutzer

Beiträge: 1 226

Dabei seit: 31. Januar 2007

Hilfreich-Bewertungen: 7

  • Private Nachricht senden

5

Montag, 30. August 2010, 15:57

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.
www.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

Samus Aran

Registrierter Benutzer

  • »Samus Aran« ist männlich

Beiträge: 2 584

Dabei seit: 12. November 2009

Hilfreich-Bewertungen: 582

  • Private Nachricht senden

6

Montag, 30. August 2010, 16:01

Binär wie in Byte-Array?
Das ließe sich mit ner For Each-Schleife lösen.

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

7

Montag, 30. August 2010, 16:09

sorry was binär-umwandlung angeht bin ich neuling.

die im o.a. umwandlung in binär habe ich gegoogelt, nun fehlt mir das gegenstück. das dies in einer schleife erfolgt ist mir schon klar aber wie sieht diese aus?
Gruß Markus

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

8

Montag, 30. August 2010, 16:19

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 ...

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
    Private Sub foo()

        Dim b(10) As Byte
        b(10) = 5
        ' mach base64
        Dim b64 As String = Convert.ToBase64String(b)
        ' und wieder zurück zu byte
        Dim c() As Byte = Convert.FromBase64String(b64)

    End Sub
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

9

Montag, 30. August 2010, 17:59

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.

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Imports System.Data 
Imports System.Data.OleDbImports System.IO 

Public Class Binr 

Inherits System.Windows.Forms.Form 
Private Puffer() As Byte 
Dim strfrile As StringDim myfilelength As Int64 
Dim Lang As Int64 
Dim Repuffer() As BytePublic 

Sub Dateiquelle_Einlesen(ByVal QuellDatei As String) 

Using br As New System.IO.BinaryReader(New System.IO.FileStream(QuellDatei, IO.FileMode.Open)) 
Puffer = br.ReadBytes(br.BaseStream.Length) 
br.Close() 
End Using 

End Sub 
Public Sub Dateiquelle_BinrSpeichern(ByVal Dtab As String) 

cmd.CommandText = "INSERT INTO " & Dtab & _ 
" (FN01, FN02, FN03, FN04, FN05)" & _ 
" VALUES (@ai,@nu,@dn,@length,@bild)" 

Try 
Dim insertcmd As New OleDbCommand(cmd.CommandText, con) 
insertcmd.Parameters.Add( _ 
"@ai", OleDbType.Char).Value = "A" 
insertcmd.Parameters.Add( _ 
"@nu", OleDbType.Char).Value = "100" 
insertcmd.Parameters.Add( _"@dn", OleDbType.Char).Value = Bilddatei 
insertcmd.Parameters.Add( _"@length", OleDbType.Integer).Value = Puffer.Length 
insertcmd.Parameters.Add( _"@bild", OleDbType.Binary).Value = Puffer 

con.Open() 
insertcmd.ExecuteNonQuery() 
Catch ex As Exception 
MessageBox.Show(ex.Message.ToString) 
Finally 
con.Close() 
End Try 
End Sub 

Public Sub DateiBinr_Wiederherstellen(ByVal AIndex As String, ByVal BIndex As String, ByVal DTab As String) 

Try 
If BIndex = "" Then cmd.CommandText = "Select * from " & DTab & " where FN01 like '" & AIndex & "'"If BIndex <> "" Then cmd.CommandText = "Select * from " & DTab & " where FN01 like '" & AIndex & "'" _ 
& "and FN02 like '" & BIndex & "'" 
con.Close() 
con.Open() 
reader = cmd.ExecuteReaderDo While reader.Read 
DLES(1) = reader("FN01") 
DLES(2) = reader("FN02") 
DLES(3) = reader("FN03") 
Lang = reader("FN04") 
Repuffer = reader("FN05") 

Loop 
con.Close() 
Dim datinhalt As String = Convert.ToBase64String(Repuffer)My.Computer.FileSystem.WriteAllText(ZielDatei, datinhalt, True) 
Catch ex As Exception 
MsgBox(ex.Message) 
End Try 
End Sub 


End Class
Gruß Markus

T1g0r

Registrierter Benutzer

Beiträge: 1 226

Dabei seit: 31. Januar 2007

Hilfreich-Bewertungen: 7

  • Private Nachricht senden

10

Montag, 30. August 2010, 19:00

Visual Basic Quellcode

1
2
3
4
'Datei in Base64:
Dim Base64 As String = Convert.ToBase64String(File.ReadAllBytes(Quelldatei))
'Base64 in Datei:
File.WriteAllBytes(Zieldatei, Convert.FromBase64String(Base64))
www.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

Es hat bereits 1 registrierter Benutzer diesen Beitrag als hilfreich eingestuft.

Benutzer, die diesen Beitrag hilfreich fanden:

Programmer85

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

11

Montag, 30. August 2010, 19:28

Hallo,

habe die Änderungen für die Konvertierung übernommen.

Nun erhalte ich folgende Fehlermeldung Konvertierung des Parameterwertes von String in Byte[] fehlgeschlagen beim Speichern der Daten in die Datenbank.
Gruß Markus

T1g0r

Registrierter Benutzer

Beiträge: 1 226

Dabei seit: 31. Januar 2007

Hilfreich-Bewertungen: 7

  • Private Nachricht senden

12

Montag, 30. August 2010, 19:35

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?
www.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

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

13

Dienstag, 31. August 2010, 08:16

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

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

14

Dienstag, 31. August 2010, 08:30

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)
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Westerwälder

Registrierter Benutzer

  • »Westerwälder« ist männlich
  • »Westerwälder« ist der Autor dieses Themas

Beiträge: 117

Dabei seit: 9. Februar 2010

Wohnort: Höhn

  • Private Nachricht senden

15

Dienstag, 31. August 2010, 09:10

Also die ganze Geschichte vergessen und wieder nur den Link auf die Datei speichern?
Gruß Markus

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

16

Dienstag, 31. August 2010, 09:12

Also die ganze Geschichte vergessen und wieder nur den Link auf die Datei speichern?

Ja. Auch weils ganz einfach die BESTE Lösung ist ;)
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Social Bookmarks