
Geschrieben von
sofl
(Moderator) am 09.06.2008 um 17:51 Uhr.
Beiträge: 12 /
#1730
Kontakt:
Mailen
|
ICQ
Um auf MySQL Datenbanken im Delphi zuzugreifen giebt es verscheidene Möglichkeiten. Viele nehmen ZEOS- oder dbExpress Komponente. Das Tutorial zeigt eine mehr oder minder einfachere Variante. Zudem sind die Units kostenlos und können auf
http://sourceforge.net/projects/directsql heruntergeladen werden.
Bei MySQL direct handelt es sich nicht um Komponenten, sondern um, wie bereits erwähnt, Units, die Klassen enthalten, die in einer Anwendung wie gewohnt instanziiert und
freigegeben werden müssen.
Folgende MySQLdirect-Units müssen in den Interface-Abschnitts der Hauptunit unseres Programmes eingebunden werden:
uses ...umysqlvio, uMysqlCT, uMysqlClient, uMysqlHelpers;
Noch vor den Typdeklarationen muss die Include-Datei eingebunden werden:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
uses ...,umysqlvio, uMysqlCT, uMysqlClient, uMysqlHelpers;
[b]{$I mysqlinc.inc}[/b]
type
TForm1 = class(TForm)
Button1: TButton;
...
Im private-Abschnitt ( public auch möglich ;p ) von TForm1 deklarieren wir nun folgende Objektreferenzen:
private
FMysql: TMysqlClient;
FResult: TMysqlResult;
FMySql verweist auf das Objekt, welches für den Datenbankzugriff benötigt wird.
FResult ist für die Ergebnismenge von Abfragen zuständig.
beim start unseres Programmes sollte FMySql gleich erzeugt werden. Also am besten ins Form.OnCreate oder Form.OnShow Ereignis schreiben.
procedure TForm1.FormCreate(Sender: TObject);
begin
FMysql := TMysqlClient.create;
end;
Es empfiehlt sich das Object bei Programmende wieder freizugeben
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMysql.Free;
if FResult<>nil then
FResult.free;
end;
Nun machen wir uns an den Verbindungsaufbau... am besten einen Button erstellen und ins OnClick Ereignis folgendes schreiben
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.Button1Click(Sender: TObject);
begin
FMysql.Host := 'localhost';
FMysql.port := 3306;
FMysql.user := 'root';
FMysql.password := 'O.O';
FMysql.UnixSocket := '';
FMysql.Db := 'sofl'; // kann auskommentiert werden
FMysql.UseNamedPipe := false;
FMysql.UseSSL := false;
FMysql.Compress := true;
FMysql.TrySockets := false;
if FMysql.Connect then
ShowMessage('Verbindung aufgebaut')
else
ShowMessage('Fehler beim Verbinden: '+FMysql.LastError);
end;
unser FMysql object enthält zahlreiche sub proceduren/functionen wie z.b.
1* giebt einen Booleschen Wert zurück (true or false)
FMysql.create_db('meinedb') // 1*
FMysql.select_db('meinedb') // 1*
FMysql.drop_db('meinedb') // 1*
FMysql.change_user(user, pass, db) // 1*
FMysql.stat // giebt einen String zurück (Statistiken)
FMysql.Connected // 1*
FMysql.ping // 1*
und viele mehr...
Man kann natürlich auch eigne abfragen erstellen...
Hier eine Bsp Function
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function execsql(abfrage: string): Boolean;
begin
if assigned(FResult) then begin
if FMysql.Status<>MYSQL_STATUS_READY then
ShowMessage('Ein Ergebnis wurde unvollständig gelesen!');
FreeAndNil(FResult);
end;
FResult := FMysql.query(abfrage, true, Result);
anwenden...
execsql('delete from user where id="23"');
Eine Selectabfrage im Stringgrid ausgeben ? Kein Problem!
Hier eine Procedure aus einehm Programm von mir
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
procedure Tmain.showtable;
var i, j: integer;
af: TMysql_FieldDef;
cr: integer;
begin
if assigned(main.FResult) then
begin
if main.FResult.ResultType=rtStored then
begin
cr := main.FResult.RecNo;
main.StringGrid1.RowCount := main.FResult.RowsCount+1;
main.StringGrid1.ColCount := main.FResult.FieldsCount;
for i:=0 to main.FResult.FieldsCount-1 do
begin
af := main.FResult.FieldDef(i)^;
main.StringGrid1.cells[i,0] := af.Name;
end;
main.FResult.First;
for i:=0 to main.FResult.RowsCount-1 do
begin
{
if main.FResult.RecNo=cr then
main.StringGrid1.Cells[0,i+1] := '*'
else
main.StringGrid1.Cells[0,i+1] := '';
}
for j:=0 to main.FResult.FieldsCount-1 do
main.StringGrid1.Cells[j,i+1] := main.FResult.FieldValue(j);
main.FResult.Next;
end;
main.FResult.RecNo := cr;
end
else
begin
main.StringGrid1.RowCount := 2;
main.StringGrid1.ColCount := main.FResult.FieldsCount+1;
for i:=0 to main.FResult.FieldsCount-1 do
begin
af := main.FResult.FieldDef(i)^;
main.StringGrid1.cells[i+1,0] := af.Name;
end;
for j:=0 to main.FResult.FieldsCount-1 do
main.StringGrid1.Cells[j+1,1] := main.FResult.FieldValue(j);
end;
end;
// statusbar1.Panels[1].Text := inttostr(stringgrid1.rowcount-1)+' Datensätze';
end;
um diese auszuführen müssen wir allerdings erst einmal unsren FResult füllen.
in Kombination mit der execsql Function ist das ein Kinderspiel
if execthissql('Select * from User') then
showtable;
Jou das wars soweit, ich hoffe es war bissl informativ
mfg teh sofl