0% found this document useful (0 votes)
426 views

Lazarus and MySQL

Using a MySQL database in A Lazarus program is a step-by-step guide. You will connect using components from the SQLdb component palette. This palette has a specific MySQL component which we will use.

Uploaded by

happydentist
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
426 views

Lazarus and MySQL

Using a MySQL database in A Lazarus program is a step-by-step guide. You will connect using components from the SQLdb component palette. This palette has a specific MySQL component which we will use.

Uploaded by

happydentist
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

Home - - A2 Databases - - A2 Scripts - - A2 Problems - - AS Hardware - -

Database Tutorials - - Lazarus Tutorials - - Lazarus - - Linux - -


Using a MySQL database in a Lazarus program
Version 1
Introduction
Preparations
Putting the Lazarus Database Components on the form
Connecting
SELECT
INSERT direct
INSERT with TSQLQuery
Viewing the data
DELETE
Appendix A : Getting MySQL with XAMPP lite
Appendix B : Creating a MySQL database
Appendix C : Getting libMySQL.dll
Appendix D : Starting MySQL in XAMPP lite
Screenshot
Source Code
Top
Introduction
A Lazarus program can modify, interrogate and view the contents of an existing
MySQL database.
This tutorial is a step-by-step guide. However, it is worth looking at the layout of
the Form and the source code now. They are at the end of this document.
I am working with Lazarus 0.9.28.2 beta in MS Windows.
You will connect using components from the SQLdb component palette. This
comes with Lazarus. This palette has a specific MySQL component which we will
use.
Top
Preparations
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
1 14 2014/6/6 09:07
Create a folder called MySQLConnect. To save a Lazarus application into the
folder
Click File/New/Application and the familiar Form1 should appear
Click File/Save All and navigate to your MySQLConnect folder
Click Save (for the unit) and Save (for the project).
Click the green run icon and check that a blank form appears
Close the blank form.
Lazarus is ready.
If you need to get MySQL then see Appendix A.
You need to create a MySQL database beforehand. My database is called A.db. I
created it using the XAMPP lite portable webserver. See Appendix B.
You need to start the MySQL server. This is easy with XAMPP lite. See Appendix
C
You need the file libMySQL.dll for MySQL 5.0 in the same folder as your Lazarus
project. See Appendix D.
Everything is now in place.
Summary
You need
A Lazarus project in a folder called MySQLConnect
A MySQL database called A with the table - Student(StudentID, First,
Second)
The file libMySQL.dll in a folder called MySQLConnect
Top
Putting the Lazarus components on the form
In Lazarus, you need to find the SQLdb component palette at the end of the row
of tabs holding components. On the right of SQLdb component palette you will
find a component called TMySQL50Connection.
Click on it.
Click on Form1 and drag open a window
Release and the component will appear. TMySQL50Connection is not a
visible component. It does not appear on the Form when the program runs.
We will change its properties dynamically as the program runs.
The TSQLTransaction component is at the other end of the SQLdb component
palette.
Drop a TSQLTransaction component underneath the TMySQL50Connection
component on the form using the same method as before. This component
passes Database transactions to the Connection component.
The TSQLQuery component is in the SQLdb component palette near the
TSQLTransaction component.
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
2 14 2014/6/6 09:07
Drop a TSQLQuery underneath the TSQLTransaction component. The TSQLQuery
component stores the results from any query that you have run on the database.
It also passes any changes to its contents to the TMySQL50Connection
component.
The TDatasource component is in the Data MySQL component palette.
Drop a TDatasource component on the form underneath the TSQLQuery1
component. This takes data from the TSQLQuery component and feeds it to the
database-aware components that you will shortly put on your form.
The TDBGrid component is in the DB controls component palette.
Drop a DBGrid component onto your form under the TDatasource component.
This is a visible component so you must drag it to a reasonable size on your
form. It is a database-aware component and it displays whatever it is fed from
the datasource.
The TButton component is in the Standard component palette.
Drop a button onto your form at the top and resize it.
Click on the Button once.
Check that the Object inspector shows the button and change the caption
property from Button 1 to Connect
The button should now have the word Connect on it.
Click the green run button. A form with just your button should appear.
Close the form.
Summary
Components on the form
MySQL50Connection1
SQLTransaction1
SQLQuery1
Datasource1
DBGrid1
Button1 : caption = 'Connect'
Top
Connecting
You now set up the connection between the program and the database. When
you click the button Connect then a connection to a.db, (the MySQL database)
is made and the data from your database will appear in the DBgrid.
Here is how:
Double-click the button. The source editor appears. In the Button1click
procedure add the following code:
procedure TForm1.Button1Click(Sender: TObject);
begin
MySQL50Connection1.DatabaseName:='LazConnect';
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
3 14 2014/6/6 09:07
MySQL50Connection1.UserName:='Admin';
MySQL50Connection1.Transaction:=SQLTransaction1;
SQLTransaction1.Database:=MySQL50Connection1;
SQLQuery1.Database:=MySQL50Connection1;
SQLQuery1.Transaction:=SQLTransaction1;
SQLQuery1.UsePrimaryKeyAsKey:=False;
SQLQuery1.SQL.Text:='SELECT * FROM Student';
Datasource1.dataset:=SQLQuery1;
DBGrid1.DataSource:=DataSource1;
end;
This code
Tells the TMySQL50Connection the name of the database and the
transaction
Tells the TSQLTransaction the name of the TMySQL50Connection
Tells the TSQLQuery the name of the TMySQL50Connection and the
TSQLTransaction.
Tells the datasource the name of TSQLQuery
Tells the DBGrid the name of its datasource
You can see that it prepares a route from the database to the DBGrid. It also
prepares (but does not execute) a query to get all the data from the database
using
SELECT * FROM Student
Run the program.
Click the button
There should be no errors. You should see the same as before.
If the program doesnt run or there is an error when you click the button then
you must stop and check everything. It is pointless to proceed since this problem
is going to block you every time.
Add a label to Form1. The TLabel component is in the 'Standard' component
palette. This label will change to show you are connected when you connect.
To do this, add the 5 lines that are highlighted just before the end;
Datasource1.dataset:=SQLQuery1;
DBGrid1.DataSource:=DataSource1;
MySQL50Connection1.Open;
If MySQL50Connection1.Connected then
begin
Label1.caption:='connected -great';
end;
end;
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
4 14 2014/6/6 09:07
Rerun the program
Click the button
Connected to MySQL database great should appear in the label.
If the label doesnt change then you must stop and check everything. It is
pointless to proceed since there is no connection.
Next add the one line of code immediately after the code you just wrote and just
before the end of the procedure:
SQLQuery1.open;
This single line executes the query that was prepared earlier. The table of results
is stored in SQLQuery1
Select * from Student
is passed to the TMySQL50Connection and then to the database and the result is
passed back through the chain to the TSQLQuery, the datasource and into the
DBGrid.
Run the program
It should compile without errors
Click the button
The label should say 'Connected to MySQL database - great' The DBGrid should
fill up with the data from your database.
If it does then that is great. You can go on. If it doesnt then you must stop and
check everything. It is pointless to proceed since there is no connection.
Summary
Components
Label1
Procedures
Button1.Click
Initialise components
Connect
Open Query
Top
SELECTing data
You can interrogate the data in the database using SELECT.
Add a new button (Button2) and in the Object Inspector change the buttons
caption to SELECT. Also add an editbox (Edit2) onto the form so that the user
can enter their SELECT command. It needs to be fairly wide.
Add the procedure below
procedure TForm1.Button2Click(Sender: TObject);
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
5 14 2014/6/6 09:07
begin
SQLQuery1.Close;
SQLQuery1.SQL.text:=edit1.text;
SQLQuery1.Open;
end;
Closing SQLQuery1 clears the contents in preparartion for a new query. Then the
new query is loaded. Then the new query is executed and the table of results
made available in SQLQuery1.
Run the program.
Click the Connect button
Check that the data appears in the DBGrid
Enter SELECT First FROM Student;
Click the Select button
The list of first names only should appear in the DBGrid.
Summary
Components
Button2 : caption = 'SELECT'
Editbox1
Procedures
Button2.Click
Deactivates the SQLQuery1
Copies the query from the edit box into SQLQuery
Executes the Query
Reactivates SQLQuery
Top
INSERTing data directly
There are two ways of inserting data into the database. Both work and both are
good. The first method uses a transaction
Add a new button (Button3) and in the Object Inspector change its caption to
Insert. Also add an editbox (Edit2) so that the user can enter their INSERT
command. It needs to be fairly wide.
Double-click on the button and add this source code:
procedure TForm1.Button3Click(Sender: TObject);
begin
SQLTransaction1.commit;
SQLTransaction1.StartTransaction;
MySQL50Connection.ExecuteDirect(edit2.text);
SQLTransaction1.commit;
end;
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
6 14 2014/6/6 09:07
The first line completes any transactions that may be outstanding from
procedures that we have yet to write. The next three lines simply perform the
transaction. This procedure changes the database directly according to the
INSERT command in the edit box.
So if you write
INSERT INTO Student VALUES (23, Fred,Jones);
then this will enter Fred Jones as student 23 into the database.
Run the program
Click the connect button
Add the above In the editbox
Click the Insert button.
Enter in the select edit box - SELECT * FROM Student;
Click the select button
the new entry in the DBGrid.
Close the application.
Summary
Components
Button3 : caption='INSERT'
Editbox2
Procedures
Button3.Click
Inserts data directly
Top
INSERTing data with TSQLQuery
This is the second way. This method uses SQLQuery and is very similar to
SELECT
Double-click on the button3 and add this source code:
procedure TForm1.Button3Click(Sender: TObject);
begin
//Not now needed - we will use SQLQuery1 instead
//SQLTransaction1.commit;
//SQLTransaction1.StartTransaction;
//SQLite3Connection.ExecuteDirect(edit2.text);
//SQLTransaction1.commit;
SQLQuery1.Close;
SQLQuery1.SQL.text:=edit1.text;
SQLQuery1.ExecSQL;
end;
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
7 14 2014/6/6 09:07
Using // comments out a line in Lazarus. The technique above is a neat way of
making code invisible to the compiler but retaining it for reference or later use.
This is very similar to the SELECT code. The rule is -
if you are using SELECT or expect data to be returned to SQLQuery then use
SQLQuery1.open to execute the query.
if you are using INSERT/DELETE/CREATE and expect NO data to be returned
to SQLQuery then use SQLQuery1.ExecSQL to execute the query.
Now if you write
INSERT INTO Student VALUES (24, Stefani,Germanotta);
then this will enter 'Stefani Germanotta' as student 24 in the database.
Run the program
Click the connect button
Add the above in the INSERT editbox
Click the Insert button.
Enter in the select edit box - SELECT * FROM Student;
Click the select button
Check the new entry is in the DBGrid.
Close the application.
Summary
Components
Button3 : caption='INSERT'
Editbox2
Procedures
Button3.Click
Insert data with SQLQuery
Top
Viewing the database in a memo box
You can see the whole database in a memobox. The memobox cant be edited
and it doesnt change with each new SELECT because it is not a database-aware
component. Its still nice to see the database contents initially (and its easy!).
Add a new button (Button4) and in the Object Inspector change its caption to
Show Whole Database. Add a memo box from the Standard component palette.
procedure TForm1.Button4Click(Sender: TObject);
begin
SQLQuery1.Close
SQLQuery1.SQL.Text:='Select * FROM Student';
SQLQuery1.Open;
while not SQLQuery1.Eof do
begin
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
8 14 2014/6/6 09:07
memo1.lines.add(
' ID: ' + SQLQuery1.FieldByName('StudentID').AsString +
' First name: ' + SQLQuery1.FieldByName('First').AsString +
' Second name: ' +
SQLQuery1.FieldByName('Second').AsString) ;
SQLQuery1.Next;
end;
end;
The first 3 lines execute the query
SELECT * FROM Student;
so the whole table is copied to SQLQuery1 automatically. It then appears in the
DBGrid because DBGrid is database-aware. This is just as before.
The while block analyses the database table row-by-row. For each row it dumps
a string into the memo box. The string is created by concatenating 4 smaller
strings, two of which are simple labels and two of which are the entries in that
row of the database.
Run the program
Click Connect
Click Show Whole Database
The database should appear in the DBGrid and the memo box.
Summary
Components
Button4 caption='View the Whole Database'
Memobox1
Procedures
Button4.Click
Runs SQLQuery1
Cycles through the database table in SQLQuery1
Creates a formatted string of the contents of each row
Puts the string into the memo box.
Top
DELETE data
The method for deleting data is easy. Remember that the code for INSERT isn't
just for INSERT but for any SQL command that does not return a result from the
database. DELETE is just such a command. Therefore the code for DELETE is
identical to the code for INSERT. Therefore you can enter a DELETE command in
the INSERT edit box and it will work Remember to then run 'SELECT * FROM
Student' in order to see the effect.
The SQL command
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
9 14 2014/6/6 09:07
DELETE FROM Student WHERE StudentID=23
will delete student 23 Fred Jones from the database
.
To test this out write
Run the program
Click the connect button
Add the above in the Insert editbox
Click the Insert button.
Enter in the select edit box - SELECT * FROM Student
Click the select button
Check the entry has gone from the DBGrid.
Close the Form.
To get a 'good' DELETE button you would first have the code for INSERT and
then have the code for opening the query 'SELECT * FROM Student' after it. Then
the result will then appear instantaneous.
Top
Appendix A
Getting MySQL with XAMPP lite
The best way to get MySQL is to have it as part of the portable webserver XAMPP
lite. This is an easy download.
Top
Appendix B
Creating a simple MySQL database called A.db
You need to create an MySQL database. My database is called A.db, and it has
one table called Student, with three columns - StudentID(number), First(text)
and Second(text). There are three rows in the table.
To produce the database
Open a text editor like Notepad
Save a text file with filename A.txt
Copy and paste the SQL below into it.
-- SQL for the Student table
CREATE TABLE Student(
StudentID INTEGER PRIMARY KEY NOT NULL,
First VARCHAR(20),
Second VARHAR(20));
-- Some Student Values
INSERT INTO Student VALUES (1, David, Beckham);
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
10 14 2014/6/6 09:07
INSERT INTO Student VALUES (2, William, Shakespeare);
INSERT INTO Student VALUES (3, Reginald, Dwight);
-- End of SQL
Then -
Start MySQL (see Appendix D).
Open your browser.
Type http://localhost/phpmyadmin into the URL edit box.
phpmyadmin will appear. It is a really nice GUI for MySQL
Look at the first window you see
Create a database called A.
Enter the database by double-clicking on it (on the left)
Select import
Browse to the A.txt file you created earlier, which has SQL in.
Click Go
The Student table should have been imported along with the three records.
Check they are there by browsing them.
Top
Appendix C
Getting libMySQL.dll
The libMySQL.dll file MUST be for MySQL5.0 NOT MySQL5.1.
Unfortunately, XAMPPlite now comes with MySQL5.1.
Therefore you can not copy the file of the same name from XAMPPlite.
Nonetheless, the 5.0 file can be obtained from the Internet but it is not easy to
find.
You can try a search. MySQL is open-source and so there should not be a
problem with copyright.
This is how I did it. Visit the MySQL archive, download the whole of MYSQL 5.0
and install it on your C drive. Then look in the folder C:/Program Files/MySQL
/MySQL 5.0/bin you will find libMySQL.dll. Copy and paste it in to your folder.
Top
Appendix D
Starting MySQL in XAMPP lite
You need to start the MySQL folder before you can connect
Find the XAMPPlite folder.
Click on the folder to open it
Click on the orange XAMPP control icon
Click start MySQL
Click start Apache
They should both then say running. MySQL has started. You can make a
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
11 14 2014/6/6 09:07
connection.
The link between Lazarus and A is made.
Top
Screenshot of the form
Top
Source Code
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, odbcconn, sqldb, db, FileUtil, LResources,
Forms, Controls,
Graphics, Dialogs, DBGrids, StdCtrls;
type
{ TForm1 }
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
12 14 2014/6/6 09:07
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Datasource1: TDatasource;
DBGrid1: TDBGrid;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Memo1: TMemo;
MySQL50Connection1: TMySQL50Connection;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
MySQL50Connection1.DatabaseName:='LazConnect';
MySQL50Connection1.UserName:='Admin';
MySQL50Connection1.Transaction:=SQLTransaction1;
SQLTransaction1.Database:=MySQL50Connection1;
SQLQuery1.Database:=MySQL50Connection1;
SQLQuery1.Transaction:=SQLTransaction1;
SQLQuery1.SQL.Text:='SELECT * FROM Student';
Datasource1.dataset:=SQLQuery1;
DBGrid1.DataSource:=DataSource1;
MySQL50Connection1.Open;
If MySQL50Connection1.Connected then
begin
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
13 14 2014/6/6 09:07
Label1.caption:='connected -great';
end;
SQLQuery1.open;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SQLQuery1.Close;
SQLQuery1.SQL.text:=edit1.text;
SQLQuery1.Open;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
//Not now needed - we will use SQLQuery1 instead
//SQLTransaction1.commit;
//SQLTransaction1.StartTransaction;
//MySQL50Connection1.ExecuteDirect(edit2.text);
//SQLTransaction1.commit;
SQLQuery1.Close;
SQLQuery1.SQL.text:=edit1.text;
SQLQuery1.ExecSQL;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
SQLQuery1.Close
SQLQuery1.SQL.Text:='Select * FROM Student';
SQLQuery1.Open;
while not SQLQuery1.Eof do
begin
memo1.lines.add(
' ID: ' + SQLQuery1.FieldByName('StudentID').AsString +
' First name: ' + SQLQuery1.FieldByName('First').AsString +
' Second name: ' +
SQLQuery1.FieldByName('Second').AsString) ;
SQLQuery1.Next;
end;
end;
initialization
{$I unit1.lrs}
end.
Lazarus and MySQL http://www.alevel-computing.x10.mx/TutorialLazarusMySQL.php
14 14 2014/6/6 09:07

You might also like