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.

Delfin:
Tady se, alespon jak jsem to pochopil, micha vice veci dohromady. Radek ma nejspis na mysli konstrukci podobnou teto - pisu z hlavy do web browseru a tuto konstrukci radu let nepouzivam (raul ji oznacil jako "klasiku"):


--- Kód: Delphi ---Query.SQL.Text := 'SELECT ID, MyColumn FROM MyTable';Query.Open; Query.Append;Query.FieldByName('MyColumn').AsInteger := 666;Query.Post; Query.Locate('ID=1'); // tady by mela byt navic konstrukce s ulozenim a restore bookmark kurzoruQuery.Edit;Query.FieldByName('MyColumn').AsInteger := 777;Query.Post; 
Zatimco parametrizovany ekvivalent by mohl byt nejak takto:


--- Kód: Delphi ---Query.SQL.Text := 'SELECT MyColumn FROM MyTable';Query.Open; Query.SQL.Text := 'INSERT INTO MyTable (MyColumn) VALUES (:MyColumn)';Query.ParamByName('MyColumn').AsInteger := 666;Query.ExecSQL; Query.SQL.Text := 'UPDATE MyTable SET MyColumn = :MyColumn WHERE ID = :ID';Query.ParamByName('ID').AsInteger := 1;Query.ParamByName('MyColumn').AsInteger := 777;Query.ExecSQL;
Prvni blok kodu vygeneruje interne dotazy podobne tem co jsou v druhem bloku kodu. Mozna tim byl myslen ten generator. Tezko rict... Jinak souhlas s raulem, osobne bych spis zpozornil kdyby nekdo pouzil to co je k videni v prvnim bloku.

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 :)

Delfin:

--- Citace: Stanislav Hruška  20-12-2017, 13:08:00 ---
--- 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é?
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 :)

--- Konce citace ---

No, a chces stavet "entity framework"? Nebo pro co chces vyrabet generator SQL prikazu (FireDAC totiz v sobe jeden ma)?

Navigace

[0] Seznam témat

[#] Další strana

Odpověď

Přejít na plnou verzi