Der große ADO-Kurs - Seite 7
von Florian Reischl
Stream
Dieses Objekt ist eine Neuerung seit ADO 2.5. Es ist vor allem für den Gebrauch mit Internet-Datenbanken und XML bzw. ASP wichtig, auf was ich leider nicht genauer eingehen kann. Außerdem kann er sehr ähnlich dem Stream-Objekt aus der Microsoft Scripting Runtime verwendet werden, was ich hier auch weg lassen möchte.
Einzig hier zu erwähnen ist der Einsatz mit Binären (Bilder, Dokumente, …) Daten in einem Recordset. Diese Daten können nämlich nicht einfach so zugewiesen werden:
Me.Picture1.Picture = Rs.Fields(Bild).Value
Im Geschäftsgebrauch hat es sich zwar im allgemeinen eingebürgert zur Entlastung der Datenbank keine Binärdaten in einer Datenbank zu speichern sondern nur Links auf die Dateien in einem Filesystem, aber Ausnahmen bestätigen ja bekanntlich die Regel. Gerade bei Access ist von speichern von Binären Daten klar abzusehen da hier sonst schnell die Grenze der zu verwaltenden Daten erreicht ist. Ein möglicher Einsatz währen Dokumentum-Systeme welche Faxe, Urkunden oder andere empfindlichen Daten verwalten.
Als Spaltenformat muß in der Datenbank logischerweise auch ein binäres Format vorliegen. Bei Access ist das das „OLE-Objekt“, auf dem SQL-Server ist es beispielsweise ein Image-Feld.
6.1 Datei in Recordset
Die Handhabung des Streams ist eigentlich recht einfach. Zum einlesen einer Datei wird das Objekt instanziiert und dann über LoadFromFile gefüllt. Wichtig ist, daß das Objekt nicht einfach mit Feld = Objekt überbeben werden kann sondern bei der Übergabe an das Binärfeld des Recordsets mit der Funktion Read ausgelesen werden muß.
Hier ein kleines Beispiel zum Speichern eines Bildes in einer DB:
Option Explicit Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Dim adStr As ADODB.Stream Private Sub Command1_Click() Dim sFile As String sFile = "E:\Temp\test.jpg" Rs.AddNew If Dir$(sFile) = vbNullString Then MsgBox "Objekt kann nicht gefunden werden." Exit Sub End If ' ADO-Stream aus Datei einlesen adStr.LoadFromFile "E:\temp\test.jpg" ' ADO-Stream an DB übergeben Rs.Fields("FeldO").Value = adStr.Read Rs.Update End Sub Private Sub Form_Load() Set Cn = New ADODB.Connection With Cn .CursorLocation = adUseClient .Mode = adModeShareDenyNone .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Data Source") = "F:\Test_DBs\Access\db3.mdb" .Open End With Set Rs = New ADODB.Recordset With Rs .ActiveConnection = Cn .CursorLocation = adUseClient .LockType = adLockOptimistic .CursorType = adOpenKeyset .Source = "SELECT * FROM tblMyOle" .Open End With ' ADO-Stream definieren Set adStr = New ADODB.Stream With adStr ' Festlegen, daß ein Binäres Format gelesen wird .Type = adTypeBinary .Open End With End Sub
6.2 Recordset in Datei
Eigentlich ist die andere Richtung einfach das Selbe, nur umgekehrt. Hier wird erst das Stream-Objekt mit Read aus dem Recordset ausgelesen und dann mit SaveToFile in eine Datei gespeichert:
Private Sub Command2_Click() Dim sFile As String Dim sMsg As String sFile = "E:\Temp\testNeu.jpg" If Dir$(sFile) <> vbNullString Then sMsg = "Die Datei ist bereits vorhanden. " & _ "Soll die Datei gelöscht werden?" If MsgBox(sMsg, vbExclamation + vbOKCancel) = vbOK Then Kill sFile Else MsgBox "Datei konnte nicht ausgelesen werden." Exit Sub End If End If Rs.MoveLast ' Stream aus DB-Feld einlesen adStr.Write Rs.Fields("FeldO") ' Stream als Datei speichern adStr.SaveToFile "e:\temp\test.jpg" End Sub