Invalid Memory Access beim Zugriff auf eine DLL

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von PAMKKKKK »

Vielleicht versteh ich hier was nicht....
Aber erfindest du das Rad gerade neu ??

Funktionsfähige libmysql.dll Wrapper funktionen gibt es doch schon:
http://forums.purebasic.com/german/viewtopic.php?t=4964
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

ARg, sollte der Pointer sein allerdings an der falschen stelle. ;)

Geht aber leider auch net :(
Diese Welt ist krank und ich bin es auch...
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

PAMKKKKK hat geschrieben:Vielleicht versteh ich hier was nicht....
Aber erfindest du das Rad gerade neu ??

Funktionsfähige libmysql.dll Wrapper funktionen gibt es doch schon:
http://forums.purebasic.com/german/viewtopic.php?t=4964
Nun dort habe ich das Problem wie überall.

Ich kann keine Binären Daten abfragen (habe Bilder in der DB). Deswegen muss ich mir eine eigene kleine Wrapper Lib zusammenschustern.
Anscheinend nutzt hier keiner BLOBs und LONGBLOBS in MySQL Datenbanken :(
Diese Welt ist krank und ich bin es auch...
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Beforegod hat geschrieben: Nun dort habe ich das Problem wie überall.
Ich kann keine Binären Daten abfragen (habe Bilder in der DB). Deswegen muss ich mir eine eigene kleine Wrapper Lib zusammenschustern.
Anscheinend nutzt hier keiner BLOBs und LONGBLOBS in MySQL Datenbanken :(
Wenn du das schaffst unbedingt posten , ich habe es gestern nicht wirklich
geschafft , dummes array *g* .Mal abgesehen davon das es eh keinen Sinn macht Bilder in die
Datenbank zu schreiben. :-)

edit :

In meinem Beispiel wuerde es , wenn der Tabellen aufbau bekannt ist, so gehen

Code: Alles auswählen

  *sql.mysql = db("localhost","root", "","bubi",3306)
   
    *sql\Query("SELECT * FROM test3")
    
    Structure test_table
      id.s 
      *Pic_data.l
      Pic_Name.s
    EndStructure
    
    test.test_table
     
    While *sql\fetchrow(@test)
       
      
      CatchImage(0,test\Pic_data)
      SaveImage(0,test\Pic_Name)
      
    Wend
  
    CallDebugger
  
  *sql\close()
PAMKKKKK hat geschrieben:Vielleicht versteh ich hier was nicht....
Aber erfindest du das Rad gerade neu ??

Funktionsfähige libmysql.dll Wrapper funktionen gibt es doch schon:
http://forums.purebasic.com/german/viewtopic.php?t=4964
Weil das Rad eiert . Deine lib ist sehr langsam. Und irgendwie kann
man mit den Daten nicht wirklich viel anfangen.
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

Arbeite gerade an einer Prozedur wo das mit hilfe der Mysql bibliothek ausgeführt wird.

Funktioniert auch schon ganz gut, allerdings arschlahm :(

Sobald das teil mal richtig strukturiert ist, werde ich es hier reinstellen
Diese Welt ist krank und ich bin es auch...
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Lange Zeit Pause

Beitrag von Beforegod »

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-
Diese Welt ist krank und ich bin es auch...
Antworten