Die Community zu .NET und Classic VB.
Menü

Der große ADO-Kurs - Seite 7

 von 

Sonstige Methoden
Nächste Seite >>

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

Listing 25

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

Listing 26

Nächste Seite >>
Sonstige Methoden