Platforms to show: All Mac Windows Linux Cross-Platform
Required plugins for this example: MBS SQL Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /SQL/MySQL Write blob to file
This example is the version from Fri, 26th Sep 2019.
Project "MySQL Write blob to file.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Löschen"
Const kFileQuit = "Beenden"
Const kFileQuitShortcut = ""
EventHandler Sub Open()
// now add that file to database
dim con as SQLConnectionMBS
dim cmd as SQLCommandMBS
try
con = new SQLConnectionMBS // connection object
// where is the library?
// you can place the database client library files where you want.
// example code just has some convenient location for testing.
con.SetFileOption con.kOptionLibraryMySQL, SpecialFolder.UserHome.Child("libmysqlclient.dylib")
cmd = new SQLCommandMBS(con, "Select fblob from test_tbl") // create command object
// connect to database (mySQL in our example)
// server: 192.168.1.80
// port: 3306
// database: test
// name: root
// no password
con.Connect("192.168.1.80,3306@test","root","",SQLConnectionMBS.kMySQLClient)
// associate a command with connection
// connection can also be specified in SACommand constructor
// Usage 1. Read whole BLob(s) into internal buffers
// Select BLob from our test table
cmd.Execute
// fetch results row by row and print results
while cmd.FetchNext
// after fetching a row all Long/Lob fields are automatically read into internal buffers
// just like other data types
dim s as SQLStringMBS = cmd.Field("fblob").asBLob
MsgBox "Size of BLob is "+Str(s.BinaryLength)+" bytes"
wend
// Usage 2. Read BLob in pieces providing user callback for BLob data processing
// Select blob from our test table
cmd.Execute
// do not automatically read this field into internal buffer (into corresponding SAField object)
// we will provide a consumer for BLob fetching after FetchNext
cmd.Field("fblob").LongOrLobReaderMode=SQLValueReadMBS.kLongOrLobReaderModeManual
// fetch results row by row and print results
dim Filename as string
dim i as integer=0
while cmd.FetchNext
i=i+1
Filename="fblob"+str(i)+".bin"
dim f as FolderItem=SpecialFolder.Desktop.Child(Filename)
dim d as new MyDataConsumer(f)
// at that moment all fields are fetched except
// those that set for manual retrieving
// read them (fblob in our example) now
if not cmd.Field("fblob").isNull then
cmd.Field("fblob").ReadLongOrLob(d, 10*1024) // read 10 KB per block
end if
wend
// commit changes on success
con.Commit
catch r as SQLErrorExceptionMBS
// SAConnection::Rollback()
// can also throw an exception
// (if a network error for example),
// we will be ready
try
// on error rollback changes
if con<>nil then
con.rollback
end if
catch x as SQLErrorExceptionMBS
// ignore
end try
// show error message
MsgBox r.message
end try
End EventHandler
End Class
Class Window1 Inherits Window
End Class
MenuBar MenuBar1
MenuItem FileMenu = "&Ablage"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Bearbeiten"
MenuItem EditUndo = "&Rückgängig"
MenuItem UntitledMenu1 = "-"
MenuItem EditCut = "&Ausschneiden"
MenuItem EditCopy = "&Kopieren"
MenuItem EditPaste = "&Einfügen"
MenuItem EditClear = "#App.kEditClear"
MenuItem UntitledMenu0 = "-"
MenuItem EditSelectAll = "&Alles auswählen"
End MenuBar
Class MyDataConsumer Inherits SQLDataConsumerMBS
EventHandler Sub Write(PieceType as integer, data as string, Length as UInt32, BlobSize as UInt32)
if PieceType = kFirstPiece or PieceType = kOnePiece then
size = 0
b=file.CreateBinaryFile("")
if b=nil then
MsgBox "Failed to create the file!"
Return
end if
end if
b.Write data
size=size+Length
// show progress
MsgBox str(size)+" bytes of "+str(BlobSize)+" read."
if PieceType = kLastPiece or PieceType = kOnePiece then
b.Close
b=nil
end if
End EventHandler
Sub Constructor(f as FolderItem)
file=f
End Sub
Property Private Size As UInt64
Property Private b As BinaryStream
Property Private file As FolderItem
End Class
End Project
See also:
The items on this page are in the following plugins: MBS SQL Plugin.