| Autor | Správa |
Manny
 Užívateľ
 Založený: 01.10.2009 Príspevky: 73 Vek: 22
 |
Zdravím,
vo svojom projekte používam komponenty ZeosLib, ktoré sú určené pre prácu s MySQL. V tomto balíku pracujem s komponentou Connection a Query. V praxi to vyzerá asi nasledovne:
Kód pre pripojenie k MySQL cez komponentu Connection:
| kód: | Connection.HostName := IniConfig.ReadString('mysql', 'host', '127.0.0.1');
Connection.Database := 'db';
Connection.Catalog := 'tabulka';
Connection.User := 'user';
Connection.Password := 'heslo';
Connection.Connect; |
Ak chcem vykonať nejaký príkaz s MySQL, tak použijem komponentu Query:
| kód: | Query.SQL.Text := 'SELECT * FROM users;';
Query.Open;
while not Query.EOF do begin
ShowMessage(Query.FieldByName('UsrName').AsString);
end; |
Toto samozrejme funguje výborne. Problém však nastáva, keď potrebujem vykonať viac príkazov v jeden moment cez jednu komponentu Query. Ako najlepší príklad bude, keď chcem použiť Query v Timeri a potom kdekoľvek inde v aplikácii. Ak by došlo k "stretnutiu", vyskočí výnimka.
Riešenie vidím vo vytváraní inštancií Query, teda raz sa vytvorí (programovo) Connection a na ten sa budú už len linkovať vždy nové Query používané v projekte a po ich využití sa z pamäte uvoľnia. No a toto neviem ako spraviť. Možno cez triedy? |
| |
     |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Po 20.09.10 10:33 |   |
tento balik som este nepouzival ale to by nemal byt problem
| kód: | Query2 := TZQuery.Create(Self);
Query2.Connection := Connection; // Connection je to ktore uz raz mas vytvorene
Query2.SQL.text ='...';
...
|
|
| |
  |
 |
Manny
 Užívateľ
 Založený: 01.10.2009 Príspevky: 73 Vek: 22
 | Zaslal: Po 20.09.10 14:32 |   |
No toto by mohlo fungovať! Keď to už nebudem potrebovať, tak to uvoľním z pamäte cez Query2.Free? A ešte jedna otázka, treba nejak deklarovať Query2 alebo sa to vykoná už v riadku:
| kód: | | Query2 := TZQuery.Create(Self); |
|
_________________ Bad news: Time flies. God news: You are the pilot! | |
     |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Po 20.09.10 14:54 |   |
ano treba declarovat
| kód: |
procedurec xy()
var Query2 : TZQuery;
begin
Query2 := TZQuery.create(self);
....
Query2.Free();
end;
|
|
| |
  |
 |
Manny
 Užívateľ
 Založený: 01.10.2009 Príspevky: 73 Vek: 22
 | Zaslal: Po 20.09.10 15:00 |   |
Díky moc, coldak, funguje to výborne  |
| |
     |
 |
Manny
 Užívateľ
 Založený: 01.10.2009 Príspevky: 73 Vek: 22
 |
Ešte mám takú otázku. Môj aktuálny kód pre select je napr.:
| kód: |
var
Q: TZQuery;
begin
Q := TZQuery.Create(Self);
Q.Connection := Connection;
Q.SQL.text ='SELECT ...';
Q.Open;
while not Q.EOF do begin
ShowMessage(Q.FieldByName('stlpec').AsString);
end;
Q.Close;
Q.Free;
end;
|
Dá sa to ešte nejak zjednodušiť? |
| |
     |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Ut 21.09.10 15:35 |   |
no zjednodusit ani nie, skor by som povedal ze by sa ti tam hodilo par testov na osetrenie, napr najprv otestovat ci je connection aj pripojena? pracu s Q by som obalil do bloku try..finaly vo finaly by som dal close a free objektu Q aby doslo k uvolneniu objektu aj v pripade nejakej exception. |
| |
  |
 |
Manny
 Užívateľ
 Založený: 01.10.2009 Príspevky: 73 Vek: 22
 |
Ešte sa tu vyskytuje jeden problém - tá komponenta TZQuery (teda jej instancie) sú vytvorené cez "Self", takže sa viažu častokrát na formulár. No a tu zase môže vzniknúť problém prekrytia, lebo ak budem mať spustený Timer1 na Form1 a bude tam tlačidlo, ktoré bude pracovať s názvom rovnakej premennej, tak môže dôjsť k stretu. Nedá sa tá instancia nejak vytvárať nezávisle na názve? |
| |
     |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 |
jednak by sa mala dat vytvarat instancia miesto self pouzi nil.
tiez mozes vytvorit anonymnu instanciu
| kód: |
begin
with TZQuery.Create(nil) do begin
Connection := ConnectionXX;//pozor zmen meno instancie TZConnection alebo sa skus na nu odkazovat cez self.Connection
SQL.text ='SELECT ...';
Open;
while not EOF do begin
ShowMessage(FieldByName('stlpec').AsString);
end;
Close;
Free;
end;
end;
|
|
| |
  |
 |
|