Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0444: ADO Binärdaten in einer DB speichern und wieder auslesen

 von 

Beschreibung 

Ein Beispiel wie man Binärdaten wie Bilder, Dokumente oder anderes in einer Datenbank speichert und wieder ausliest. Diese Daten nennt man Blob, Image oder in Access "OLE-Objekt". Es sei jedoch darauf hingewiesen, daß diese Vorgehensweise bedacht sein muß! Gerade bei Access oder ähnlichen Jet-Datenbanken sollte man diesen Weg vermeiden da die Datenbank so sehr schnell an Größe zunimmt und langsam wird. Bei solchen Datenbanken sollte man stattdessen nur den Verweis auf die Datei im Filesystem speichern und dann von dort laden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,64 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'-------------- Anfang Projektdatei BLOBs.vbp  --------------
' Es muss ein Verweis auf 'Microsoft ActiveX Data Objects 2.5 Library' gesetzt werden.
' Die Komponente 'Microsoft Common Dialog Control 6.0 (SP3) (comdlg32.ocx)' wird benötigt.

'------- Anfang Formular "frmMain" alias frmMain.frm  -------
' Steuerelement: Listen-Steuerelement "lstDateien"
' Steuerelement: Schaltfläche "cmdDelete"
' Steuerelement: Standarddialog-Steuerelement "dlgDialog"
' Steuerelement: Schaltfläche "cmdAddFile"
' Steuerelement: Beschriftungsfeld "lblHinweis"
Option Explicit
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Doc As ADODB.Stream

Public Sub Aktualisieren()
    On Error Goto Fehler
    lstDateien.Clear
    Rs.MoveFirst
    Do While Not Rs.EOF = True
        lstDateien.AddItem Rs.Fields("Beschreibung").Value
        Rs.MoveNext
    Loop
    Exit Sub
    
Fehler:
    If Err.Number = 3021 Then
        MsgBox "Keine Datensätze vorhanden", vbInformation
    End If
End Sub

Private Sub cmdAddFile_click()
    On Error Goto Fehler
    Set Doc = New ADODB.Stream
    dlgDialog.ShowOpen
    With Doc
        .Type = adTypeBinary
        .Open
        .LoadFromFile dlgDialog.FileName
    End With
    Rs.AddNew
    Rs.Fields("File") = Doc.Read
    Rs.Fields("Beschreibung") = InputBox("Beschreibung;")
    Rs.Update
    Aktualisieren
    Exit Sub
    
Fehler:
    If Err.Number = 32755 Then Exit Sub
End Sub

Private Sub cmdDelete_Click()
    Rs.MoveFirst
    Rs.Move lstDateien.ListIndex
    Rs.Delete
    Rs.Update
    Aktualisieren
End Sub

Private Sub Form_Load()
    Set Cn = New ADODB.Connection
    Set Rs = Nothing
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.3.51"
        .ConnectionString = "Data Source=" & App.Path & "\Tips.mdb"
        .Open
    End With
    Set Rs = New ADODB.Recordset
    With Rs
        .Source = "select Beschreibung, File from tblTips"
        .LockType = adLockOptimistic
        .CursorType = adOpenStatic
        Set .ActiveConnection = Cn
        .Open
    End With
    Aktualisieren
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set Rs = Nothing
    Set Cn = Nothing
    Set Doc = Nothing
End Sub

Private Sub lstDateien_DblClick()
    On Error Goto Fehler
    Set Doc = New ADODB.Stream
    dlgDialog.ShowSave
    With Doc
        .Type = adTypeBinary
        .Open
        Rs.MoveFirst
        Rs.Move lstDateien.ListIndex
        .Write Rs.Fields("File")
        .SaveToFile dlgDialog.FileName
        .Close
    End With
    Exit Sub
    
Fehler:
    If Err.Number = 32755 Then Exit Sub
End Sub

'-------- Ende Formular "frmMain" alias frmMain.frm  --------
'--------------- Ende Projektdatei BLOBs.vbp  ---------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 12 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Renate Brandt am 04.02.2009 um 11:52

Ich erhalte die Fehle´rmeldung

benutzerdefinierter Typ nicht definiert bei ADODB.STREAM

Was habe ich vergessen?

Gruß

Renate

Kommentar von Volker am 31.03.2005 um 11:44

Hi,

es gibt die Möglichkeit, eine Datei nicht in Einem, sondern z.B. Kb- weise runterzuladen. Weiß jemand, wie das fuktioniert ? Ich brauche diese Funktion, um einen Fortschritts- Balken während des Downloads einer 20MB- Datei aus einer Oracle- Datenbank anzuzeigen.

Kommentar von Falk am 25.08.2004 um 14:07

AddNew funktioniert bei mir auch nicht und es kommt zu einem Fehler. Der sagt mir das eine Einschränkung seitens des Providers handelt oder des LockType. Ich benutze den MSDAORA, weil ich in einem Long Raw Feld in Oracle die Bilder speichern will.

Insert Into geht gar nicht.

Was mache ich Falsch??

Kommentar von J"Org am 08.09.2003 um 09:58

Hallo,

also bei mir funktioniert dieses alles in Abhängigkeit von dem DBMS! Ich habe z.B. mit Ingres keine Probleme, mit MySQL und Oracle funktioniert dieser Code nicht, hier müssen bestimmt DMBS-Eigenheiten (Einstellungen) berücksichtigt werden.

J"Org

Kommentar von ariesdave am 15.07.2003 um 14:04

hallo,

bei mir funktioniert der o.g. tipp nicht. ich erhalte die fehlermeldung, dass ein benutzerdefinierter typ nicht definiert ist.

offensichtlich kennt meine vb version die 'stream' eigenschaft des 'adodb' objektes nicht...

wer kann mir hier einen tipp geben?

danke
-dave

Kommentar von Hartmann Horst am 04.07.2003 um 16:19

nochmal....

Hat sich erledigt. Das Recordset muss im gebundenen Modus sein. Eigendlich logisch :-)

thx, Harti

Kommentar von Hartmann Horst am 04.07.2003 um 15:11

Hallo zusammen

Der Source ist nicht schlecht...
Leider funktioniert bei mir "rs.AddNew" nicht ?!
Weiss jemand an was das liegen könnte ?

Vielen Dank, Harti

Kommentar von Matthias am 11.02.2003 um 10:02

Hi,

wo finde ich die Tips.mdb Datei.
Vielen Dank.

Kommentar von Said am 20.01.2003 um 15:55

Hallo,
das Beispiel greift auf eine Accessdatenbank zu, wie sieht es aus mit SQL-Server 2000, und was ein Datentyp sollte man nehmen?
vielen Dank.

Kommentar von Stefan am 13.08.2002 um 06:50

Ich kann mir die Datei leider nicht runtrladen weil der Server nicht gefunden wird. Kann mir jemand die Datei zugänglich machen?

Kommentar von Johannes am 09.04.2002 um 13:46

Bei mir funktioniert das Beispiel, jedoch sobal ich versuche ein zweites Datenfeld mit Binärdaten in der DB zu füllen, tritt ein Fehler auf. Gibt es da eine Beschränkung, das in einer AcessDb nur ein OLEObjekt - Feld sein darf ? Danke
Gruß
Johannes

Kommentar von Frank am 07.03.2002 um 09:10

Bei mir funktioniert das Beispiel leider nicht. Fehlermeldung "Micrsoft ActiveX Data Objects 2.5 Libary" nicht vorhanden. Kann ich diese Libary irgendwo heunterladen!
Danke! Gruß Frank