Code-Beispiel
Von FreeBASIC aus auf MySQL zugreifen
| Lizenz: | Erster Autor: | Letzte Bearbeitung: |
| k. A. | MOD | 09.08.2011 |
Hinweis: Der Text und der Code sind Teil der Reihe
Programmieren für Oma und wurden minimal für die Veröffentlichung hier angepasst. Vielen Dank für die Erlaubnis der Nutzung an croco97, dem Autor des
Originaltextes.
Die Möglichkeiten mit MySQL werden natürlich erst dann richtig ausgefahren, wenn wir die Mächtigkeit einer nativen Programmiersprache wie FreeBASIC mit einem Relationales Datenbank-Management-System, kurz "RDBMS" und SQL verbinden. Let's start.
Als aller erstes müssen wir dafür sorgen, dass FreeBASIC die libmysql.dll findet. Sie findet sich nach der MySQL-Installation im MySQL-Programmverzeichnis unter lib (oder lib/opt). Aber da findet sie FreeBASIC nicht. Einfach nach windows\system32 kopieren.
Mit Freebasic SQL's abschicken und das Ergebnis lesen
Nun zur Interaktion mit FreeBASIC selbst, d.h. zu den notwendigen Befehlen der MySQL-API, um einen SQL abzuschicken und das Ergebnis nach FreeBASIC zu bekommen.
| Befehl | Bedeutung |
| db = mysql_init( NULL ) | Initialisiere den API-Zugriff. db ist vom Typ MYSQL Ptr und ein Handle auf das verwendete DB-System. |
| result = mysql_real_connect( db, NULL, "root", "a", dbname, MYSQL_PORT, NULL, 0 ) | Verbindet mit einer Datenbank dbname unter dem User "root", dem Passwort "a". Das zweite Argument wäre eigentlich die Adresse, (z.B. eine IP-Adresse), wo das Programm das RDBMS findet. Bei NULL sucht es auf dem eigenen Rechner (unter "localhost"). result ist vom Typ Integer und ist ungleich Null, wenn alles geklappt hat. |
| result = mysql_select_db( db, dbname ) | Auswahl der Datenbank. (Entspricht "use dbname;" innerhalb des MYSQL-Clients). |
| error = mysql_query( db, sql_query_string ) | Absetzen eines SQL-Befehls. error ist vom Typ Integer. Ist error = 0, ist alles in Ordnung. sql_query_string kann eine String-Konstante sein, also z.B. "select * from jettype;" oder eine ZString-Variable. |
| restab = mysql_store_result( db ) | Veranlasst die API, das Ergebnis der letzten Query in einer Struktur vom Typ MYSQL_RES Ptr abzuspeichern. |
| nrow = mysql_num_fields( restab ) | Die Frage ist, wie lang die Ergebnistabelle denn geworden ist. mysql_num_fields( restab ) gibt Antwort darauf. nrow ist vom Typ Integer. Tabellen > 2 Mrd. Zeilen sind tunlichst zu vermeiden... |
| ncol = mysql_num_fields( restab ) | Meistens werden wir wissen, wie viele Spalten unsere Tabelle hat. Aber sicher ist sicher. ncol ist vom Typ Integer. |
| row = mysql_fetch_row( restab ) | Hier bekommen wir nun endlich die Daten der nächsten Zeile. row[] ist ein Array von ZStrings, also vom Typ ZString Ptr Ptr |
| mysql_free_result( restab ) | Gibt alle Resourcen der Ergebnistabelle frei. |
| mysql_close( db ) | Schliesst den RDBMS-Zugriff. |
Das Ganze können wir in einem zusammenfassenden kleinen Beispielprogramm betrachten, in dem wir den Inhalt der jettype-Tabelle (näheres dazu im
Originaltextes) auf dem Bildschirm ausgeben:
#Include Once "mysql\mysql.bi"
#Define NULL 0
Sub connect1
Dim db As MYSQL Ptr
'Initialisiere die API. db zeigt auf das MySQL-System.
db = mysql_init( NULL )
Dim dbname As String
dbname = "test"
'Verbinde dich mit dem MySQL-System.
'2. Argument: Adresse des Servers. NULL = Localhost.
If( mysql_real_connect( db, NULL, "root", "a", dbname, MYSQL_PORT, NULL, 0 ) = 0 ) Then
Print "Can't connect to the mysql server on port"; MYSQL_PORT
mysql_close( db )
End 1
End If
'Waehle die Datenbank aus.
If( mysql_select_db( db, dbname ) ) Then
Print "Can't select the "; dbname; "Color = teal>"" database !"
mysql_close( db )
End 1
End If
'Gib ein Informationen zum RDBMS-Host und zur Datenbank aus.
Print "Client info: "; *mysql_get_client_info( )
Print "Host info: "; *mysql_get_host_info( db )
Print "Server info: "; *mysql_get_server_info( db )
'Schicke ein SQL los.
Dim res As Integer
res = mysql_query( db, "select * from jettype;" )
'Deklariere einen Zeiger auf die Ergebnistabelle
Dim restab As mysql_res Ptr
If res = 0 Then
'Hole den Zeiger auf die Ergebnistabelle
restab = mysql_store_result( db )
If restab > 0 Then
Dim As Integer nrow
'Wie viel Zeilen hat die Ergebnistabelle?
nrow = mysql_num_fields( restab )
Print nrow
If nrow > 0 Then
Dim As Integer i, j, ncol
Dim As mysql_row row
'Wie viel Spalten hat die Ergebnistabelle?
ncol = mysql_num_fields( restab )
Print ncol
'Lies die Ergebnistabelle aus.
For i = 0 To nrow - 1
'Hole die naechste Zeile der Ergebnistabelle
row = mysql_fetch_row( restab )
Print i,
'Gib alle Spalten der aktuellen Zeile auf dem Bildschirm aus.
For j = 0 To ncol - 1
Dim s As String: s = *row[j]
Print s; " - ";
Next j
Print
Next i
Sleep
End If
End If
'Mache den Speicherplatz der Ergebnistabelle frei.
mysql_free_result( restab )
Else
Print "sql query error"
End If
'Schliesse den API-Zugang.
mysql_close( db )
End 0
End Sub
connect1Bei Interesse des Themas Datenbanken mit MySQL und FreeBASIC sollte das vollständige
Tutorial gelesen werden. Darin werden die Grundlagen von Datenbanken besprochen, ein kleiner Einblick in den Funktionsumfang gegeben und es bietet ein vollständiges Beispiel mit Übungsaufgaben, die den Lernerfolg weiter fördern.
| Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 09.08.2011 von
MOD angelegt.
- Die aktuellste Version wurde am 09.08.2011 von
MOD gespeichert.
|
|