Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Datenbanken

k22:k22.4:k22.4.12:start

22.4.12 Klasse Blob (gb.db)

Blob steht für `Binary large object` als großem binären Datenobjekt, das von Datenbank-ManagementSystemen (DBMS) in besonderer Weise verarbeitet wird. Die Klasse `Blob` kann nicht erzeugt werden. Ein Blob-Objekt wird von einem Blob-Feld zurückgegeben und dient zum Lesen oder Schreiben seines Inhalts.

Im Zusammenhang mit Datenbanken und dem Feld-Type `BLOB` finden Sie das Argument, dass zum Beispiel zur Speicherung von Bildern direkt in einem Feld einer DB-Tabelle auch alternative Ansätze existieren:

  • Bild über Base64 in Text umwandeln und den (ASCII-)Text in einem Text-Feld abspeichern.
  • Nur den Bild-Pfad in einem Text-Feld abspeichern und das dazu gehörende Bild in einem Ordner im Dateisystem speichern, auf den der DB-Benutzer Lese- und Schreibzugriff hat.

Die zweite Ansatz wird favorisiert mit der Begründung, dass Bilder und andere Binaries im Dateisystem gespeichert werden sollten, weil das Dateisystem der Speicher für Dateien ist. Außerdem behandeln die von Gambas unterstützten DBMS den Feld-Typ ` BLOB` in unterschiedlicher Weise. Das DBMS MySQL macht zum Beispiel keinen Unterschied zwischen einem Blob-Feld und einem normalen Textfeld.

Im Kapitel 22.13 werden Ihnen Projekte vorgestellt, bei denen große binäre Datenobjekte direkt oder indirekt in einer Datenbank-Tabelle für unterschiedliche DBMS (SQLite3, PostgreSQL und MySQL) gespeichert werden.

Genaue Informationen zu großen binären Datenobjekten unter dem Aspekt DB-Datentypen finden Sie im Kapitel 22.3 DB-Mapping und unter dem Link: http://gambaswiki.org/wiki/doc/db-type-mapping.

22.4.12.1 Eigenschaften

Die Klasse Blob verfügt nur über zwei Eigenschaften:

EigenschaftDatentypBeschreibung
DataStringSetzt den Feld-Inhalt oder gibt den Feld-Inhalt zurück.
LengthIntegerLiefert die Länge des Blob-Inhalts als Anzahl seiner Bytes.

Tabelle 22.4.12.1.1 : Eigenschaften der Klasse Blob

Beispiel 1 - Bild in ein Datenbank-Feld vom Typ Blob einfügen

Public Function SetImagePath() AS String
 
  If Dialog.OpenFile() Then Return
  Dialog.Title = "Select an image file!"
 
  Return Dialog.Path
 
End
 
Public Sub btnSaveImage_Click()
 
     Dim hDBResult As Result
 
'--- Die DB-Transaktion wird gestartet
     DBCS.DBConnection.Begin()
'--- Es wird ein lesbares und beschreibbares Result-Objekt erzeugt
     hDBResult = DBCS.DBConnection.Create("images") ' DBTabelle-Name: `images` 
'--- Das Feld `blob_image` wird mit dem Inhalt des ausgewählten Bildes gefüllt
     hDBResult["blob_image"] = File.Load(SetImagePath())
'--- Der aktualisierte Feld-Inhalt wird in die DBTabelle `images` übernommen
     hDBResult.Update()
'--- Die DB-Transaktion wird bestätigt    
     DBCS.DBConnection.Commit()
     Message.Info("Image saved.")
     hDBResult = Null
 
     Catch
       Message.Error("Fehler!" & gb.NewLine & Error.Text & gb.NewLine & Error.Where)
       DBCS.DBConnection.Rollback()
End

Beispiel 2 - Bild in Base64 konvertieren und den Text(!) in ein Datenbank-Feld vom Typ Text einfügen

'--- Es wird die SQL-Anweisung definiert, um das ausgewählte Bild in den Datensatz von `Hans` zu übernehmen
     sSQLStatement  = "INSERT INTO images (blob_text)"
     sSQLStatement &= " VALUES Base64(File.Load(SetImagePath()))"
     sSQLStatement &= " WHERE name = 'Hans'"
 
'--- Die SQL-Anweisung wird ausgeführt
     DBCS.DBConnection.Exec(sSQLStatement)
 
     Catch
       Message.Error("Fehler!" & gb.NewLine & Error.Text & gb.NewLine & Error.Where)
       DBCS.DBConnection.Rollback()

Beispiel 3 - Bild in ein Datenbank-Feld vom Typ Blob einfügen ⇒ Dialog zur Bildauswahl (DataControl)

Wenn Sie der Programm-Oberfläche für ein Datenbank-Programm ein Steuerelement DataControl (rot markiert) spendieren und es mit einem Feld vom Typ `Blob` verbinden, dann wird automatisch ein Dialog-Button (grün markiert) auf das DataControl gelegt. Im Dialog wählen Sie das Bild aus, das Sie in die Datenbank-Tabelle für den ausgewählten Datensatz einfügen wollen:

Abbildung 22.4.12.1.1: Blob-DataControl

Bildanzeige: Im Change()-Ereignis der DataSource ermitteln Sie zuerst die ID des aktuell ausgewählten Datensatzes (→ 26), lesen dann den Bildinhalt aus und speichern den Bildinhalt danach temporär in einer (Bild-)Datei ab. Abschließend zeigen Sie das Bild in einer Picture-Box an:

Public Sub DataSource1_Change()
 
  Dim hDBResult As Result
  Dim hTempFile, sSQLStatement As String
  Dim hBlob As Blob
  Dim iID As Integer
 
  If DataSource1.Index > -1 Then 
 
     hTempFile = Temp() & ".png"
 
     iID = DataSource1["m_id"]
     sSQLStatement = "SELECT picture FROM members WHERE m_id=" & iID
     hDBResult = DBCS.DBConnection.Exec(sSQLStatement)
 
     If hDBResult.Available Then
        hBlob = hDBResult["picture"]
        If hBlob.Length > 0 Then
           File.Save(hTempFile, hBlob.Data)
           PictureBox1.Picture = Picture.Load(hTempFile)
           If Exist(hTempFile) Then Kill hTempFile
        Else
           PictureBox1.Picture = Null
        Endif
     Endif
 
  Endif
 
End

Eine Alternative finden Sie im folgenden Quelltext, bei dem ohne eine temporäre Bild-Datei gearbeitet wird:

Public Sub DataSource1_Change()
 
  Dim hDBResult As Result
  Dim sSQLStatement As String
  Dim hBlob As Blob
  Dim iID As Integer
  Dim hImage As New Image
 
  If DataSource1.Index > -1 Then 
 
     iID = DataSource1["m_id"]
     sSQLStatement = "SELECT picture FROM members WHERE m_id=" & iID
 
     hDBResult = DBCS.DBConnection.Exec(sSQLStatement)
 
     If hDBResult.Available Then
        hBlob = hDBResult["picture"]
        If hBlob.Length > 0 Then            
           PictureBox1.Picture = hImage.FromString(hBlob).Picture
        Else
           PictureBox1.Picture = Null
        Endif
     Endif
 
  Endif
 
End

Download

Die Website verwendet zwei temporäre Session-Cookies. Diese technisch notwendigen Cookies werden gelöscht, wenn der Web-Browser geschlossen wird! Informationen zu Cookies erhalten Sie in der Datenschutzerklärung.
k22/k22.4/k22.4.12/start.txt · Zuletzt geändert: 13.09.2019 von honsek

Seiten-Werkzeuge