MySQL und Purebasic

Anfängerfragen zum Programmieren mit PureBasic.
tebse
Beiträge: 3
Registriert: 14.02.2018 11:32
Computerausstattung: HP Elitebook 8560p mit Windows 7 Enterprise
Diverse Server im Keller.
Wohnort: Fricktal, Schweiz

MySQL und Purebasic

Beitrag von tebse »

Liebe Purebasic-Enthusiasten:

ich verzweifele gerade daran, einen FreePascal-Code in Purebasic zu übersetzten. Dabei geht es um ein einfaches MySQL Insert. Ich habe mittlerweile 1/2 dutzend Codes und Beispiele (sowohl Sniplets als auch kompeltte Wrappe) hier aus dem Forum erfolgls versucht zum Laufen zu bringen. Rahmenbedingung:
Der Code darf nicht unter OBCD laufen, die zugehörige Purebasic Libary soll nicht verwendet werden. Es ist libmysql.dll zu verwenden. Faktisch habe ich zwei Fragen:
1. Hat jemand ein wirklich funktionierendes, wirklich simples beispiel. Ich würde gerne schritt für Schritt jede Zeile verstehen, sodass ich mir daran entlang hangeln kann.
Mein Free-Pascal code war wir folgt:

Code: Alles auswählen

mysql_init(PMySQL(@qmysql));                                                                                                                //Database Init
sock :=  mysql_real_connect(PMysql(@qmysql),PStrings^[SRV],PStrings^[USR],PStrings^[PWD],nil,0,nil,0); //Sock definition
mysql_select_db(sock,PStrings^[DB]);                                                                                                      //Selec Database from Sock
mysql_query(sock,PChar(writedb));                                                                                                           //Send string to sock
mysql_close(sock);                                                                                                                                   //Close Sock link
Ich versuche mich mit Purebasic an den Code heranzutasten...

Code: Alles auswählen

host.s    = "172.17.0.xxx"
user.s    = "xxx"
passwd.s  = "xxx"
db.s      = "xxx"
port.l    = 3306

;- Structures
Structure MYSQL
EndStructure

dbHnd.l 
#libmysql = 1

If OpenLibrary(#libmysql,"libmysql.dll")
  Result=CallFunction(#libmysql,"mysql_init",dbHnd)
  Debug Result
  If Result
    dbHnd = Result
    Debug dbHnd
    ; Function : mysql_real_connect(*mysql.MYSQL,host.s,user.s,passwd.s,db.s,port.l,unix_socket.s,client_flag.l)
    ; Usage    : Result.l = mysql_real_connect(*mysql.MYSQL,host.s,user.s,passwd.s,db.s,port.l,unix_socket.s,client_flag.l)
    ; Desc     :
    PrototypeC.l PB_mysql_real_connect(*mysql.MYSQL,host.s,user.s,passwd.s,db.s,port.l,unix_socket.s,client_flag.l) :  mysql_real_connect.PB_mysql_real_connect = GetFunction(#libmysql,"mysql_real_connect")
    
    Result = mysql_real_connect(dbHnd, host, user, passwd, db, 3306, "", 0)

    Debug result
  EndIf
EndIf


Es funktioniert:

Code: Alles auswählen

OpenLibrary(#libmysql,"libmysql.dll")
  Result=CallFunction(#libmysql,"mysql_init",dbHnd)
Problem für zuerst, dass Callfunction keine Strings verarbeiten kann. Daher konnte ich "mysql_real_connect" nicht direkt verwenden und habe den

Code: Alles auswählen

CallFunction(#libmysql,"mysql_real_connect",dbHnd, xxx, ....)

nach mehreren erfolglosen Versuchen über Bord geworfen. Dabei habe ich u.a. versucht die nötigen Strings über Zeiger (wie oben im FreePascal) zu übergeben. Passend Beispiele aus dem Forum habe ich mit meiner Purebasic-Version nicht zum laufen gebracht. Anschliessend bin ich zu einem Bespiel gewechselt, dass PrototypeC und Structuren verwendet.

2. Frage:
Kann mir jemand etwas besser erklären, wie Prototypes, Structures und Zeiger in Purebasic konret funktionieren: Ich finde die Hilfe hier etwas unklar. Was sind Structures, Prototypes und Zeiger genau und welches Problem sollen sie konkret lösen. Analog, wie funktionieren Prototypes / PrototypesC. Verwirrend finde ich dazu das beispiel Zu Zeigern aus der Hilfe:

Code: Alles auswählen

Text$ = "Hello"
  *Text = @Text$            ; *Text speichert die Adresse des Strings im Speicher
  *Pointer.String = @*Text  ; *Pointer verweist auf *Text
  Debug *Pointer\s          ; Darstellen des Strings, welcher sich


weil @ und * irgendwie nicht richtig erklärt werden. Mir würde fürs erste auch hier schon mal ein gutes, einfaches Beispiel, das sicher funktioniert, reichen. Ich bin auch gerne bereit mich über Telefon / eine Webleitung / ein Webinar auszutauschen :-) ... Ich bitte den Helfer aber vorab um Geduld mit meiner Unkenntnis ...

Danke und Gruss
Tebse
--
PureBasic 5.62, 64 und 32 bit
Window 7/64 bit Ultimate
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: MySQL und Purebasic

Beitrag von ts-soft »

Ist ja ne ganze Menge, die Du Wissen möchtest :) Da mach ich mal den Anfang:

Eine Structure ist dasselbe wie ein UserDefinedType in anderen Sprachen.

Ein Prototype ist eine definition von Parametern einer Variablen, wie sie zum Beispiel für DLL-Aufrufe sinnvoll sind. CallFunction kann ja keinen Type angeben, so das dieser Callaufruf nicht zu empfehlen ist, stattdessen wird vorher ein Prototype definiert, so das der Compiler weiß, wieviel, welche Art usw. Variable zu erwarten ist und kann entsprechend reagieren und prüfen.

PS: Ein grosses C im Namen bei CallFunction, Procedure (dll) usw., steht meist für die CallingConvention CDECL, ohne dann StdCall. Für 64-Bit gilt immer die FastCall Convention.

Ein Zeiger oder Pointer beinhaltet die Adresse einer Variablen.

Code: Alles auswählen

a.i = 1000
b.s = "Hallo"
a ist eine Integervariable mit dem Wert von 1000. @a ist die Adresse von a
b ist eine Stringvariable mit dem Wert "Hallo". @b ist die Adresse von b

Die mit dem @ Operator ermittelten Adressen weisen wir am bestem einem Pointer (Zeiger) zu also:
*bla = @b

Jetzt bekommste noch einen kompletten MySQL Wrapper, ohne ODBC, von HeXOR:
http://www.purebasic.fr/english/viewtop ... 28#p423628

Ich hoffe mal, es wird jetzt doch einiges deutlicher. Ansonsten kannste jetzt ja gezieltere Fragen stellen.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten