Delphi > FireDAC

FireDAC - TFDStoredProc - defaultní hodnota parametru

(1/2) > >>

ondra.pillar:
Ahoj,

máme XE10.3.3 + FD + MSSQL. Při vykonávaní st. procedur používám TFDStoredProc s relativně defaultním nastavením. Po nastavení názvu procedury a nahození PREPARED = TRUE si FD automaticky přes metadata stáhne parametry. Potud je vše ok.
Problém je ovšem s defaultní hodnotou parametrů těch stored proc.
Pochopil jsem z profileru, že FD ty parametry pošle vždy všechny bez ohledu na to, jestli jsou NULL a MSSQL server potom ty NULL bere jako validní vstup a nepoužije ty defaultní (tomu se asi není co divit).
Ve svém zkoumání jsem ještě zjistil, že ADO to dělá stejně (taky stáhne a posílá celý param list), ale každý parametr má ještě property Attributes tam se dá odškrtnout NULLABLE a potom pošle TADOStoredProc ten parametr s hodnotou "default" a MSSQL už jede OK.
Možnost toho, že ty parametry nebudu stahovat automaticky ale manuálně je v kodu doplňovat bohužel zatím nepřipadá v úvahu.
Zkoušel jsem taky ten param list procházet, hledat NULL a ty odstranit, to zase působí chybu protože ta StoredProc už je prepared a brání se potom tomu.
SOS možnost je dát té TFDStoredProc prepared := false, odebrat FetchOptions.Items := FetchOptions.Items - [fiMeta], dát prepared znovu a ty parametry tam ručábo nacpat, ale do toho se mi nechce tak se první ptám :-)

díky za rady a nápady.

ondra.pillar:
Tak edit,
zavolat toto nakonec pomohlo a nebylo to složité, ale přesto bych ocenil, kdyby někdo věděl nějaké elegantnější řešení

--- Kód: ---....
Prepare := false;
FetchOptions.Items := FetchOptions.Items - [fiMeta]
// projet vsechny parametry a vybrat /vymazat/ ty, ktere jsou null
Prepare := true;
....

--- Konec kódu ---

Jan Fiala:
Tohle je cesta, pokud ti nevadí, že se procedura vlastně spouští 2x. I ADO poprvé spustí proceduru nebo dotaz 2x, jednou, aby si stáhlo parametry a následně ji teprve vykoná. Všechna další spuštění z ADO, pokud se příkaz nemění jdou už pak jen jednou.
U kritičtějších operací a většího počtu parametrů je to pak znatelné zdržení, zvlášť na pomalejší síti - třeba když s klientem jedeš vůči serveru přes internet a VPN.

Vzhledem k tomu, že do budoucna můžeš změnit klienta, měl bys mít ošetřeno v proceduře, které parametry jsou povinné a pokud nepošleš vše, mělo by to skončit chybou z procedury s hlášením, že jsi neposlal nějaký parametr.

pf1957:

--- Citace: Jan Fiala  06-04-2021, 07:18:52 ---Vzhledem k tomu, že do budoucna můžeš změnit klienta, měl bys mít ošetřeno v proceduře, které parametry jsou povinné a pokud nepošleš vše, mělo by to skončit chybou z procedury s hlášením, že jsi neposlal nějaký parametr.

--- Konce citace ---
Souhlasim, v podstate nevhodny navrh. RDMBS maji nullable typy, takze bud ten parametr je povinny a musim ho uvest a nebo propaguju ev. testuju hodnotu NULL. Samozrejme nejake zaboxovani v modernim jazyku s podporou nullable typu jako C# to osetri na urovni prekladu klienta, takze neni treba cekat na run-time chybu.

ondra.pillar:

--- Citace: Jan Fiala  06-04-2021, 07:18:52 ---Tohle je cesta, pokud ti nevadí, že se procedura vlastně spouští 2x. I ADO poprvé spustí proceduru nebo dotaz 2x, jednou, aby si stáhlo parametry a následně ji teprve vykoná. Všechna další spuštění z ADO, pokud se příkaz nemění jdou už pak jen jednou.
U kritičtějších operací a většího počtu parametrů je to pak znatelné zdržení, zvlášť na pomalejší síti - třeba když s klientem jedeš vůči serveru přes internet a VPN.

Vzhledem k tomu, že do budoucna můžeš změnit klienta, měl bys mít ošetřeno v proceduře, které parametry jsou povinné a pokud nepošleš vše, mělo by to skončit chybou z procedury s hlášením, že jsi neposlal nějaký parametr.

--- Konce citace ---

Díky za odpověď,
No jasně, že mi to vadí více-méně "principiálně", protože nemám rád tyhle quick'n'diry solution. Respektive se to ke mě dostalo jako požadavek, že po přechodu na FD se děje toto :-/ a zarazilo mě, že FD pošle vždy všechno, ale jak nad tím víc a víc přemýšlím tak mi to přijde jako bezpečnější postup

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi