Forum Delphi.cz

Databáze => MS SQL => Téma založeno: panjavlik 24-07-2020, 14:19:48

Název: ADO - Multi query
Přispěvatel: panjavlik 24-07-2020, 14:19:48
Ahoj,

jsem Delphi začátečník a tvořím si pro radost. Narazil jsem na problematiku s kterou mi ani Google nepomohl a tak bych chtěl požádat radu zkušenějšcíh.

Používám:
1x TADOConnection v kterém mám nastavený "Connection string".
2x TADOQuery u které mám property "Connection" = "TADOConnection",  dále "SQL" s dotazem do DB.


1. Potřebuji rozdělit data za TADOQuery1 do 3 tabulek a nevím jakým způsobem lze filtrovat vstupní data do DBGrid (Používám LiveBinding v RAD Studio).
2. Když Close/Open obě TADOQuery, zůstávají mi vyset jako Session v Active Monitoru nad dotazovanou databází (do chvíle než "Neterminatnu" celý program) , zkoušel jsem "Closenout" s "Free" ale stále zůstávají vyset (TADOConnection mám KeepAlive zároveň je užit u obou query jako connection).

První problém je pro mě majoritní, přecejen tvořit kvůli rozdělení 2 další dotazy s WHERE se mi zdá jako hloupost :(

Mockrát děkuji za pomoc, vážím si každé rady.

Hezký den
JP
Název: Re:ADO - Multi query
Přispěvatel: Radek Červinka 24-07-2020, 17:05:24
Jedna Query = jeden DBGrid, grid zobrazuje data z te sve query a dynamicky z neho cte data.

Mas 2 moznosti:
- nahradit DBGrid za neco jineho (treba ListView v modu Report, nebo stringgrid) a ten naplnit, pak uz query nepotrebujes
- pouzit 3 query
 
Cim se lisi ty dotazy? Normalne bych ti poradit 3x mem table a ty plnit z toho jednoho query s nastavenim Filter.

Ale pokud chces DBGrida tak v tvem pripade bude lepsi po startu priradit kazde query nejaky SQL s parametrem, tj. query1.SQL .... , query2.sql...
Název: Re:ADO - Multi query
Přispěvatel: Stanislav Hruška 24-07-2020, 17:59:08
Keďže dopyty sa líšia iba v časti WHERE, tak je možné si celý SQLText, okrem WHERE uložiť do reťazca a tie WHERE do troch samostatných reťazcov Where1..3. Pri požiadavke na zmenu výberu v Query zmeniť text poskladaním z požadovaných reťazcov SQLTex + WhereN, DBGrid vyprázdniť a znova naplniť. S DBGrid nerobím, tak neviem ako to s ním je.
Vytvárať viac QUERY nie je až také strašné. Nezaberajú veľa pamäte. Ale ľahko sa stane, že sa v nich človek stratí.

Ja osobne používam vždy len jedno QUERY a texty vytváram dynamicky.
Pozor, odporúča sa do QUERY dať naraz celý kompletný SQLTex! Použitie Add() nie je práve najlepšie. Pri každom priradení textu sa totiž na pozadí vždy spúšťa jeho kontrola!
Název: Re:ADO - Multi query
Přispěvatel: Stanislav Hruška 24-07-2020, 18:02:01
Ešte mi prišla na um dôležitá vec. Vždy dôsledne používaj parametre!
Možno si vystačíš len s jedným textom a budeš iba meniť parametre. V takom prípade sa používa Query.Refresh.
Název: Re:ADO - Multi query
Přispěvatel: panjavlik 24-07-2020, 19:40:25
Dobrý večer ,

Moc děkuji za tak rychlé odpovědi, vážím si toho :-)

U mě je nejspíš problém i v tom , ze potřebuji naplnit 3 gridy z query na jednom formuláři.

Zajímavá mi přijde myšlenka naplnit memfile hodnotami a ten si pak snadno rozsekat jako zdroj pro string grid.

Používání dynamického query je skvělý nápad , mockrát diky za tip

Položil jsem dotaz , protože neznám možnosti Delphi a nevěděl jsem , zda-li neexistuje nějaká jednoduchá možnost přes property například :-)

Ohledně druhé otázky mi šlo o to , jestli nevadí ze mi na SQL serveru zůstávají v Activity monitory viset ty dotazy a zbytečně tak sql nedostává za uši :-)

Mockrát Vám děkuji ještě jednou
Název: Re:ADO - Multi query
Přispěvatel: Radek Červinka 26-07-2020, 09:24:08
Ohledně druhé otázky mi šlo o to , jestli nevadí ze mi na SQL serveru zůstávají v Activity monitory viset ty dotazy a zbytečně tak sql nedostává za uši :-)

Zajímavé, co máš nastaveno u Query v property CursorLocation a CursorType ? Máš tam clUseClient ? Ještě můžeš po otevření nastavit Query.Connection := nil; coz by melo zpusobit v pripade ADO komponent ze se z toho stane lokalni query.
Název: Re:ADO - Multi query
Přispěvatel: panjavlik 29-07-2020, 15:13:57
Ahoj,

CursorLocation: clUseClient
CursorType: Static


Zkusil jsem hodit na Event "AfterOpen"   AdoQuery1.Connection := nil; 

ale bohužel stále zůstavají otevřená.

Aktuálně to vypadá takto:
Formulář 1 - 1x Adoquery s přímým ConnectionStringem
Formulář 2 - 2x Adoqeury přes TadoConnection