Databáze > Obecné

Parametrizované príkazy

(1/15) > >>

Stanislav Hruška:
Tému zakladám na základe tejto diskusiehttp://forum.delphi.cz/index.php/topic,15942.msg98307.html#new{http://forum.delphi.cz/index.php/topic,15942.msg98307.html#new
Je pre mňa zaujímavá a má mať vlastné vlákno. Mám tu zmätok, nedostatok vedomostí a pod.
--- Citace ---Vždycky když někde vidím, jak má někdo v kódu SQL příkaz INSERT a kousek dál jiný kód s SQL UPDATE, a tam všude nastříkané parametry, tak se zarazím.
--- Konce citace ---
Ja si to bez parametrov predstaviť neviem. Mám k dispozícii dva varianty.
--- Kód: ---INSERT INTO MYTABLE
(FIELD1, ...)
VALUES(:PARAM1,...)
--- Konec kódu ---
alebo
--- Kód: ---INSERT INTO MYTABLE
SELECT * FROM TABLE1
WHERE ...
--- Konec kódu ---
Toto si bez časti WHERE neviem predstaviť. Pri UPDATE je to tak isto.
--- Citace ---Až na vyjimky, kdy opravdu musím cpát data opravdu rychle, nebo kde je ve where řetezec, si nechávám generovat update a insert přes následníka TDataset (Firedac, ADO) ze sikovneho jednoducheho SQL přikazu a používám společný kód s FieldByName a Edit nebo Append a Post.
--- Konce citace ---
Už tu viackrát zaznelo, že mám mať nejaký generátor SQL textov. Žiaľ, doteraz sa mi nepodarilo vytvoriť si o ňom žiadnu predstavu. Sem tam sa mi niečo opakuje. V mnohých prípadoch o tom ani netuším. Lenže v princípe je každé SQL unikátne. A na tom končím :'( 
Ako sa to dá robiť pomocou potomka TDataset je pre mňa záhadou.
Rád by som už konečne vedel, ako sa to generovanie SQL textov dá generovať bez toho, aby som sa z toho zbláznil.

Ak si na to vytvorím triedu, tak jej musím poslať nejaký parameter. Tých parametrov budú stovky. To podľa mňa znamená "nekonečne" dlhý case/if. Či... ??

raul:
Pouzival jsem pred lety PostgresDAC. Rozdil rychlosti pouziti primo parametrizovanych dotazu a klasiky byl propastny - pro me. Samozrejme ne vzdy tomu tak je, ale rozhodne bych se k tomu nestavel jako Radek, ze zpozornim, kdyz to nekdo pouzije. Naopak mi to rekne, ze ten clovek dela kod sviznejsi - pokud ho teda jen nechce zobrazit na formu apod. GUI aplikace nedelam, spise serverove veci.

 Jemne podobnou diskusi jsme vedli pred lety s jednim kolegou - jeho nazor, ze nechape k cemu je dnes pointerova aritmetika - nechapu ja. Treba pri zpracovani obrazu - idealni a nejrychlejsi.

Obecne myslim, ze zalezi na tom, jak z vejsky na to clvoek kouka - chce-li rychle neco napsat, pak klido. Chce-li psat dele, ale mit kod rychlejsi, pak jednoznacne parametricky.

Generator se da napsat velmi jednoduchy - treba neco jako : genInsert(string tablename; fields : array of string) : string; - kterej udela INSERT INTO <tablename> (<field1>,<field2>) VALUES(:<field1>,:<field2>) - pripadne libovolne upravit s pridanim automatickych polozek apod.

Stanislav Hruška:
viď raul
--- Citace ---Generator se da napsat velmi jednoduchy - treba neco jako : genInsert(string tablename; fields : array of string) : string; - kterej udela INSERT INTO <tablename> (<field1>,<field2>) VALUES(:<field1>,:<field2>) - pripadne libovolne upravit s pridanim automatickych polozek apod.
--- Konce citace ---
Pre tieto typy SQL (INSERT s VALUES) to ide. Vďaka. To si prerobím.
A ako na ostatné?
viď Delfin: zásadne to robím podľa druhého bloku. Akonáhle mám WHERE, CASE či niečo iné, čo má dostať niečo zvonka, tak to robím jedine cez parameter. Okrem iného mi to kontroluje správnosť typov a zbavuje potreby používať CAST. A že som sa už neraz sekol :)

Stanislav Hruška:

--- Citace ---Nebo pro co chces vyrabet generator SQL prikazu (FireDAC ma jeden v sobe)?
--- Konce citace ---
Lebo tu každý do mňa hučí, že tak to je správne ;D Niečo pravdy na tom je. Viď opakované pasáže. A že formulár má byť hlúpy. A robiť inteligentnú jednotku pre každý formulár sa mi nezdá to pravé.

raul:
Ostatne podobne -
genUpdate(string tablename; fields : array of string; ID : boolean; native_where : string) : string;
kterej udela
pokud je ID true:
UPDATE <tablename> SET <field1>=:<field1>,<field2>=:<field2> WHERE ID=:ID
pokud je ID false:
UPDATE <tablename> SET <field1>=:<field1>,<field2>=:<field2> WHERE <native_WHERE>

mySQL tusim ma prikaz REPLACE, neco podobneho ma uz i snad pgSQL, kde pokud primarni klic neni nalezen, udela se insert. Jinak samozrejme je mozno udelat hafo dalsich, realne pouzivam slozitejsi konstrukce, ale ty jsou odvisle nad db schematem, ktere pouzivam leta. Tyto konstrukce pak zajisti i spravne generovani tabulek vcetne historie atd atd atd - moznosti je velmi. Pokud clovek delat ciste GUI klikatko, tak klido pouzit klasicke komponenty -  od dob BDE. Pokud vsak chce rychlost, pak je toto rychlejsi - cokoliv univerzalniho je proste pomale a mnbohdy zbytecne (Treba ziskavat barvu obrazku pres getPixel ci jak se to jmenuje (overuje abys nekoukal za roh atd - mozna uz to tam neni, ale kdysi kdysi snad bylo - mozna v delphi, mozna ve VB, bavim se obecne).

Pokud se bavime o slozitejsich insertech apod, pak zasadne pres SP, kterou proste jen zavolam - na coz mam i generator (opet navazany na ekosystem). Takze zavolani metody delphi je stejne jako metody na SQL vcetne typu. Jo, musim mit precompiler. A jo, je to rychle a elegantni.
Za ty leta jsem si proste napsal generator db, a pak tyhle drobotiny kolem, nekdy slozite, nekdy jen jednoduche byt praci ulehcujici.
Nejak jsem moc neprivyk tem internim vymysleninam - coz nebrat zle, jen proste vzdy tam bylo cosik - opakuji GUI skoro nepisu. Ono je prima, ze se to kolikrat da naklikat jednoduse, a pak k tomu pustej zhuverilce (kterej nevi, ze existuje index v db), kterej naklika takovou sracku, ze se z toho server pos... (Resil jsem optimalizaci import dat jedne automobilky - prichazeji denne, import trval 8-16h (jednak diky dodavateli dat, druhak kvuli kokotovi co to psal)).

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi