soo..
hier der code für das Auslesen eines BLOBs.
Beschränkungen :
- Query darf nur EXAKT einen BLOB zurückgeben
- ist sehr langsam
- nicht sehr sauber programmiert
Code: Alles auswählen
Global host.s
Global user.s
Global passwd.s
Global udb.s
Global port.l
Global dbHnd.l
Global SQL.s
Global row.s
#libmysql = 1
#File = 1
host = "localhost"
user = "root"
passwd = "root"
udb = "purebasic"
port = 3306
Procedure.s GetError(db_ID,requester)
Protected Errormsg.s, i.l, Error.l
If CallFunction(#libmysql,"mysql_errno",db_ID) > 0
*Error =CallFunction(#libmysql,"mysql_error",db_ID)
i=-1
Repeat
i=i+1
Errormsg=Errormsg+PeekS(*Error+i,1)
Until PeekB(*Error+i)=0
If requester
Result= MessageRequester("MySQL error", Errormsg, #PB_MessageRequester_Ok)
EndIf
EndIf
ProcedureReturn Errormsg
EndProcedure
Procedure sql_connect()
If OpenLibrary(#libmysql,"libmysql.dll")
Result=CallFunction(#libmysql,"mysql_init",dbHnd)
If Result
dbHnd = Result
If CallFunction(#libmysql,"mysql_real_connect",dbHnd, host, user, passwd, udb, port, "", 0) = 0
GetError(dbHnd,1)
EndIf
EndIf
EndIf
EndProcedure
Procedure WriteSQLData(query.s)
Static *mysqlRows
Static *mysqlLen
Static numRows
Static numFields
If CallFunction(#libmysql, "mysql_real_query", dbHnd, query, Len(query))
GetError(udbHnd, 1)
Else
*mysqlData = CallFunction(#libmysql, "mysql_store_result", dbHnd)
If *mysqlData = 0
Else
numRows = CallFunction(#libmysql, "mysql_num_rows", dbHnd)
;numFields = CallFunction(#libmysql, "mysql_num_fields", dbHnd)
EndIf
EndIf
If numRows > 0
*mysqlRows = CallFunction(#libmysql, "mysql_fetch_row", *mysqlData)
CreateFile(#File, "D:\temp\tester.mpg")
For i = 1 To *mysqlData
*mysqlRows + 1
WriteByte(PeekB(*mysqlRows))
Next i
; Hier wird die neue MEthode ausprobiert
;*bloblength.l = CallFunction(#libmysql, "mysql_fetch_lengths", *mysqlData)
;PrintN(Str(*bloblength))
;PrintN(Str(PeekB(*mysqlRows)))
;WriteData(PeekB(*mysqlRows), Int(*bloblength))
;Input()
CloseFile(#File)
CallFunction(#libmysql, "mysql_free_result", *mysqlData)
EndIf
EndProcedure
Meistens mecker er rum wenns um das free_Result geht.. manchmal gehts ohne zu meckern, öfters hängt er sich daran auf.
Die Datei muss man selber mit angeben, wie man sie haben will.
Hier noch eine kleine Testdatei wie man die Daten auslesen kann:
Code: Alles auswählen
IncludeFile("blob_mysqldll.pb")
OpenConsole()
query.s = "SELECT data FROM blobtest"
Print("Starte MySQL Test mit " + query)
sql_connect()
WriteSQLData(query)
Für Verbesserungsvorschläge usw. bin ich dankbar
--
Kommentare habe ich mal dringelassen.. sind überreste von anderen Versuchen und anderen Aufbaustrukturen-