Gambas: Datenbank

Aus Wikibooks


Zurück zu Gambas


Vorsicht ! In diesem Abschnitt ist noch einiges in Arbeit !!

Datenbankprogrammierung nur mit Gambas[Bearbeiten]

Für das Anlegen einer simplen Adress- und Telefonnummerdatenbank brauchen Sie kein mysql. Probieren Sie es einfach Schritt für Schritt ohne mysql.

Fangen wir mit einer ganz simplen Tabelle an

1 Eins
2 Zwei 

Sie soll abzuspeichern und zu verändern und zu verlängern sein. Sonst brauchen wir erst einmal keine weiteren Funktionen.

Das Ganze kann man als Stringarray machen und in einer Textarea darstellen.

Siehe Gambas: Arrays

Beispiel:

Sie brauchen eine Form eine Textarea und 2 Commandbuttons um das Programm in Gang zu bringen.

' Gambas class file
PUBLIC SUB Form_Open()
 Textarea1.Text = "1,Eins"
 Textarea1.Text = Textarea1.Text & "2,Zwei" 
END
PUBLIC SUB Button2_Click()
Dialog.SaveFile() 
File.Save(Dialog.Path, TextArea1.Text)
'Geben Sie db.txt als Dateinamen ein 
CATCH 
IF ERROR THEN RETURN
END
PUBLIC SUB Button1_Click()
DIM sLine AS String
sLine = File.Load("db.txt")
'Die Datei muss existieren, 
'sonst kann sie nicht geladen werden. 
textarea1.Text = sLine
END

Fügen Sie jetzt noch ein paar Tabellen Einträge dazu und speichern Sie wieder ab:

3,Drei
4,Vier 
5,Fünf

Markieren Sie diese 3 weiteren datensätze und kopieren Sie sie mit Strg + C in den Zwischenspeicher. Mit Strg + V geben Sie sie wieder in Ihrer Textarea aus und speichern Sie ab.

Löschen Sie die Textarea und Laden Sie die Datenbank erneut. Siehe da, Ihre Minitabelle ist noch vorhanden.

Das ganze schaut immer noch wie eine Textdatei aus, aber auch eine richtige Tabelle wird zunächst als hintereinanderfolgende Datei abgespeichert. In unserer Minitabelle sind die einzelnen Datenfelder mit Kommas getrennt, die einzelnen Reihen ( = Datensätze) werden durch ein Return ( = Chr(10)) getrennt.

CSV Datei[Bearbeiten]

Vielleicht wollen Sie obige einfache Zahlentabelle in ein Standard CSV Datenbankformat umwandeln, wie es zb Excel oder Openoffice als Importmöglichkeit nutzt.

Das CSV-Dateiformat wird oft benutzt, um Daten zwischen unterschiedlichen Computerprogrammen auszutauschen (es ist also ein Austauschformat). Die Verwendung des Formates in den von Microsoft Excel verwendeten Formen hat sich als Pseudostandard etabliert.

Das CSV Excel Format schaut so aus:

"1","Eins"
"2","Zwei"

D.h. im Gegensatz zu unsere Darstellung sind die Eingaben in die Datenfelder noch mit einem Anführungszeichen versehen. Man muß jetzt nur aufpassen , das im Datenfeld selbst kein Anführungszeichen und kein Komma vorkommt, denn diese 2 Zeichen braucht man für die Tabellenstruktur.

Eine CSV-Datei ist eine Text-Datei, die tabellarisch strukturierte Daten enthält und vorrangig zum Datenaustausch verwendet wird. Das Kürzel CSV steht dabei für Character Separated Values oder Comma Separated Values, weil die einzelnen Werte durch ein spezielles Trennzeichen - in vielen Fällen das Komma - getrennt werden. Einzelne Datensätze werden in der Regel durch einen Zeilenumbruch (bei Windows: CR LF = carriage return, line feed; bei Unix: nur LF; bei Mac OS: nur CR) getrennt. Das CSV-Format ist unabhängig von Zeichencodierung, Byte-Reihenfolge und Zeilenumbruchszeichen.

CSV-Dateien tragen auch oft die Dateiendung .txt statt .csv und können auch in jedem Texteditor erstellt und bearbeitet werden.

Versuchen wir die CSV - Umwandlung zu programmieren: Dazu brauchen wir einen neuen Commandbutton den wir CSV nennen und folgenden Code:


PUBLIC SUB Button3_Click()
text AS String
liste AS String[]
posten AS String
reihe AS String 
text = textarea1.Text
liste = Split(text,Chr(10))
textarea1.Text = ""
FOR EACH posten IN liste
 IF posten = "" THEN 
 reihe = ""
 ELSE  
 reihe =  Chr(34) & posten & Chr(34) & Chr(10)
 END IF
 textarea1.Text = textarea1.Text & reihe 
NEXT

Das schaut schon ganz schön aus. Vor allem wird die leere Zeile am Schluss nicht mit Anführungszeichen versehen. Aber leider finden sich keine Anführungszeichen um die Kommas. Das Programm muss also noch verbessert werden:

Der String posten muss nach Kommas durchsucht werden und dann das Komma durch "," ersetzt werden. das geht am besten mit dem Replace Befehl in Gambas. Schauen Sie mit der Hilfetaste F1 und dem Alphabetischen Verzeichnis der Befehle nach, wie er verwendet wird.

Für unsere Anwendung ersetzen wir noch die Anführungszeichen durch chr(34).

PUBLIC SUB Button3_Click()
text AS String
liste AS String[]
posten AS String
reihe AS String 
text = textarea1.Text
liste = Split(text,Chr(10))
textarea1.Text = ""
FOR EACH posten IN liste
 IF posten = "" THEN 
  reihe = ""
 ELSE  
  reihe =  Chr(34) & Replace$(posten, ",", Chr(34) & "," & Chr(34)) & Chr(34) & Chr(10)
 END IF
 textarea1.Text = textarea1.Text & reihe 
NEXT

Probieren Sie es aus. Speichern Sie Ihre Minitabelle beispielsweise als db1.csv ab und versuchen Sie einmal , die Tabelle in Openoffice als Tabelle in der Tabellenkalkulation zu importieren. Klappt es ??

Verändern Sie die Tabelle in Open Office, speichern Sie diese wieder als CSV - Excel datei ab und versuchen Sie die Datei wieder in Ihr Programm zu holen, Klappt es ?

Das erscheint als überflüssige Spielerei, aber wer schon einmal versucht hat alte Datenbanken zu retten, der weiß wie wichtig Standarddatenformate und wie wichtig- Import und Exportmöglichkeiten sind.

Datenbankprogrammierung mit Gambas und MySQL[Bearbeiten]

Vorarbeiten Mysql[Bearbeiten]

Im Gegensatz zu MS Access ist Mysql zwar die Standarddatenbank im Linuxbereich, aber noch nicht ganz so leicht zu bedienen wie Access. Trotzdem ist Mysql sehr gut, da sie open source ist, sehr weit verbreitet ist und stabil läuft. Auch scheinen die Dateiformate nicht willkürlich verändert zu werden, wie dies bei MS Access ohne ersichtlichen Grund öfter der Fall war.

Sie sollten sich also etwas mit Mysql vertraut machen, bevor sie mit Gambas auf Mysql losgehen. Ansonsten werden Sie von Access denied Fehlern schnell frustriert sein.

Wenn Sie nicht wissen was eine Datenbank ist schauen Sie sich einmal folgende Seite an:

http://www.madeasy.de/2/datbank.htm

Die Einrichtung von mysql ist heute unter Linux kein allzu großes Problem mehr, da alle aktuellen Standarddistributionen die wichtigsten mysql Pakete enthalten.

Can't connect to local MySQL server through socket ...[Bearbeiten]

Wenn man Mysql unter Linux in Gang bringen will, nervt einen folgende Fehlermeldung immer wieder.

Can't connect to local MySQL server through socket ... 

Was ist der Grund für diese Fehlermeldung? Meistens liegt das Problem bereits beim Starten von Linux. Der mysql daemon wird nicht gestartet. Um den Fehler zu beheben, müssen Sie in Ihren Runleveleditor gehen. Dort aktivieren Sie Mysql, so dass die Datenbank bereits beim Booten mitgestartet wird.

Unter Suse starten Sie am besten YAST mit dem Rootpasswort. Dann geben Sie folgendes ein:

YAST - SYSTEM/RUNLEVEL-EDITOR/  Dienste 

oder

systemctl start mysql

und aktivieren mysql, falls es nicht schon aktiv ist.

Mysql von der Konsole[Bearbeiten]

Nach der Installation starten Sie ihr mysql von der Konsole mit:

/etc/init.d/mysql start

Es erscheint die Meldung: failed ( nicht erfolgreich) oder

Starting service MySQL done ( erfolgreich) 

Ich kann auf meinem Rechner mysql nur mit root Rechten starten.

Stoppen können Sie mysql mit:

/etc/init.d/mysql stop

Meldung:

Shutting down service mysql  done

Starten Sie mysql erneut und geben Sie dann ein

mysql 

Meldung:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.0.18
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql> 

Schauen Sie sich den mysql status an und geben Sie status ein:

mysql> status

Meldung:

--------------
mysql  Ver 12.22 Distrib 4.0.18, for suse-linux (i686)
Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          less
Using outfile:          
Server version:         4.0.18
Protocol version:       10
Connection:             Localhost via UNIX socket
Client characterset:    latin1
Server characterset:    latin1
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 3 min 37 sec
Threads: 1  Questions: 3  Slow queries: 0  Opens: 6  Flush tables: 1  Open tables: 0  Queries per second avg:   
0.014

Wichtig für Gambas sind hier die current database ( noch keine geladen), der current user und die connection.

Haben Sie bereits ein Mysqlpasswort vergeben kommen Sie in mysql nur mit

mysql -p 

und dann der Eingabe des Passwortes hinein. Dieses Passwort hat nichts mit dem Linux Passwort zu tun und wird außerdem vom mysql noch verschlüsselt, steht also nicht im Klartext zur Verfügung. Merken Sie es sich gut, Sie brauchen es auch für Gambas und mysql.

Schauen Sie sich dann einmal die vorhandenen Datenbanken an zb die Testdatenbank test und geben Sie ein:

USE test;

Meldung:

mysql> USE test;
Database changed

Lassen Sie sich nicht durch die Meldung: Database changed irritieren.

Lassen Sie sich nun die vorhandenen Tabellen in mysql anzeigen, aber vergessen Sie nicht den Strichpunkt hinter Ihrer Eingabe sonst wird mysql zickig.

SHOW TABLES;

Da auf meinem Rechner schon einiges in Test zu finden ist erscheint folgende Meldung:

+-----------------+
| Tables_in_test  |
+-----------------+
| NewTable        |
| __RekallObjects |
| gewuerz         |
| t1              |
| t2              |
| test            |
+-----------------+
6 rows in set (0.00 sec)

Jetzt kann man sich die einzelne Tabelle beispielsweise gewuerz anschauen:

SELECT * FROM gewuerz;

Und ich erhalte eine wunderbare Gewürztabelle: mysql> SELECT * FROM gewuerz;

+----+-----------+-------+----------+-------+---------+
| nr | name      | preis | waehrung | menge | einheit |
+----+-----------+-------+----------+-------+---------+
|  1 | anis      |   4.6 | EUR      |   6.8 | kg      |
|  2 | pfeffer   |     5 | euro     |     2 | 4       |
|  3 | safran    |     5 | e        |     3 | 3       |
|  4 | salz      |     4 | e        |     4 | 4       |
|  5 | curry     |     5 | e        |     5 | 5       |
|  6 | knoblauch |     5 | e        |     5 | 5       |
+----+-----------+-------+----------+-------+---------+
6 rows in set (0.02 sec)

Versuchen Sie sich doch auch so eine schöne Gewuerztabelle anzulegen.

Zur weiteren mysql Syntax empfehle ich folgende sehr hilfreiche Website:

http://www.selflinux.org/selflinux/html/mysql.html - Link leider defekt :-( Am besten vollziehen Sie das dortige Kunden Beispiel nach.

Arbeiten mit dem Datenbankmanager von Gambas[Bearbeiten]

Der Datenbankmanager von Gambas ist gut geeignet, um sehr schnell und übersichtlich mysql Datenbanken darzustellen, neu anzulegen und zu bearbeiten.

Sie finden Ihn im Projektfenster unter dem Menüpunkt Werkzeuge und Datenbank-Manager.


Wenn Sie ihn starten fragt er Sie nach einem kryptischen Password , daß sie eingeben müssen, auch wenn Sie sonst mysql noch als root und ohne Passwort nutzen.

Geben Sie hier einfach Return ein , gibt es eine Fehlermeldung: Please enter at least 8 characters auf Deutsch: Sie sollten ein Passwort mit mindestens 8 Buchstaben nutzen.

Haben Sie diese Passworthürde erfolgreich gemeistert , erscheinen alle Datenbankserver in einer Treeviewansicht.

Bei mir funktioniert nur der Eintrag root@localhost(mysql). Klicken Sie auf diesen , dann zeigen sich alle dort erreichbaren Datenbanken zb auch test. Klicken Sie auf eine der Datenbanken, dann zeigen sich die dortigen Tabellen. Klicken Sie auf eine Tabelle , dann können Sie diese nun im rechten Bildschirm in der Struktur ändern , neue Indizes setzen und auch neue Daten eingeben.

Probieren Sie alles aus und speichern Sie ihre Änderungen durch einen Klick auf das Diskettensymbol ab.

MySQL Nutzerrechte[Bearbeiten]

MySQL, Apache und phpMyAdmin[Bearbeiten]

Zur Darstellung von MySQL Datenbanken haben sich die Programme Apache als Webserver und phpMyAdmin als Zugriffsoberfläche sehr bewährt. Versuchen Sie diese beiden Programme auf ihrem Rechner zu installieren. Machen Sie sich dann etwas mit phpMyAdmin vertraut.

Es erleichtert die Fehlersuche enorm, wenn man eine schnelle weitere Zugriffsmöglichkeit auf die MySQL Datenbanken in Form des phpMyAdmin hat.

Datenbankprogrammierung mit Gambas und SQLite[Bearbeiten]

Nicht immer ist es notwendig, für eine kleine Datenbanklösung einen kompletten Server aufzusetzen. SQLite bietet die Möglichkeit mittels der notwendigen Treiber, welche für Gambas zur Verfügung stehen, eine DB in einer Datei ohne Server zu erzeugen.

Eine SQLite Datenbank kann man mittels den Konsolenprogramm sqlite, nach Installation der notwendigen Treiber, mit Knoda oder natürlich auch mit dem gambaseigenen Datenbankmanager erstellen.

Eine genauere Beschreibung der Datenbank findet man unter http://de.wikipedia.org/wiki/Sqlite .

Eingebunden wird die Datenbank durch die Variablen .Type und .Name der Connection, wobei für .Type "sqlite" und für .Name der absolute Pfad zur Datenbankdatei steht. Die Benutzerrechte richten sich nach den Dateirechten.


Erstellen einer Datenbankverbindung[Bearbeiten]

Beispiel für ein Datenbank-Connect. Hierbei muss die gb.db Komponente in das Projekt mit eingebunden werden:

PRIVATE $hConn AS Connection
PUBLIC SUB GoConnect()
  DIM sName AS String
  TRY $hConn.Close
  sName = "DatenbankName"
  WITH $hConn
    .Type = "mysql"
    .Host = "DatenbankServer"
    .Login = "Datenbank-Benutzerkennnung"
    .Password = "Datenbank-Benutzerpasswort"
  END WITH
  $hConn.Name = sName
  $hConn.Open
CATCH
Message.Error(Error.Text)
END
PUBLIC SUB Form_Open()
  $hConn = NEW Connection
  GoConnect
END
PUBLIC SUB Form_Close()
  $hConn.Close
END


Verfügbare Datenbanken anzeigen[Bearbeiten]

Es wird eine Datenbankverbindung mit der unter dem jeweiligen Datenbanksystem immer vorhandenen Standarddatenbank (postgresql: 'template1'; mysql: 'mysql' ...) hergestellt und die Anzahl und durch Abfrage der 'Collection' 'Databases' die dem angemeldetem Benutzer zur Verfügung stehenden Datenbanken angezeigt. Dazu wird als Datenbankname eine leere Zeichenkette angegeben. Der '.Type' ist entsprechend dem Datenbanktyp zu setzen.

Z.B. als Procedure in einem Modul:

 PRIVATE Datenbankverbindung AS Connection
 PRIVATE Datenbankname AS String
 PROCEDURE ListeDatenbanken ()
   DIM Element AS Variant
   Datenbankverbindung = NEW Connection
   WITH Datenbankverbindung
     .Type     = "postgresql"
     .Host     = "Rechnername"
     .Login    = "Benutzername"
     .Password = "Schutzwort"
     .Name     = ""
   END WITH  
   Datenbankverbindung.Open
   PRINT "Anzahl Datenbanken: " & DB.Databases.Count
   FOR EACH Element IN DB.Databases
     Print "Datenbankname: " & Element.Name
   NEXT
   Datenbankverbindung.Close
 END

Links[Bearbeiten]