Odhalujeme .net - SqlParameter
Jistě tu situaci zná každý vývojář. Říkáte si, že tohle znám, to se chová tímto definovaným způsobem a nemůže mě nic zaskočit. Jaké je pak následné překvapení a jak se odhalují takto nepředvídané situace o to bych se rád podělil v následujících odstavcích a nejen v nich. Přeci jen těch nástrah a postřehů mám za dobu co vyvíjím v .netu vícero a tak nezůstane jen u tohoto příspěvku.
Zrovna první nástraha je z poměrně blízké doby a jednalo se o SqlParameter, se kterým jsem "zápasil". Ve všech svých dotazech používám parametry, přeci jen nejsem hazardér ani začátečník, abych si dovolil tento způsob zápisu nepoužívat.
Při volání uložených procedur je pak možné, čehož rád využívám, mít parametr jako výstupní, případně kombinovaný - vstupně/výstupní. V takovém případě je však nutné výstupní hodnotu z property Value přetypovat na správný datový typ pro pozdější použití. Nejčastěji tedy použijeme tento zápis:
int result = (int)outputParameter.Value;
Jenže najednou nastala situace, se kterou jsem nepočítal. Na vývojovém prostředí vše fungovalo správně a nejevilo sebemenší chybičku. Ovšem v ostrém prostředí byla reportována chyba: Specified cast is not valid a odkaz na řádek s přebíráním výstupní hodnoty z volané uložené procedury. Zpočátku jsem byl velice nedůvěřivý a tak jsem prověřoval, zda je struktura databáze shodná a je použita stejná definice procedury. Vše ovšem souhlasilo. Jak si jistě dokážete sami představit, v tu chvíli jsem začal být lehce nervozní a v rozpacích, navíc nebylo možné se na vzdálený počítač připojit a tak jsem byl odkázán pouze na obsluhu. Ta mi také potvrdila, že jsou nainstalovány všechny verze .net frameworku - adresář %SysDir%\Microsoft.Net\Framework obsahoval všechny tři adresáře s verzemi fw.
Ač je to velice nepravděpodobné, říkal jsem si, že by problém mohl být ten, že aplikace, byť kompilovaná na verzi 1.1 tuto verzi frameworku nepoužívá. Pro vnitřní klid jsem proto vložil do konfiguračního souboru tento element:
jenž zajistí/vynutí použití právě dané verze .net frameworku. A světe div se, verze 1.1 frameworku nebyla nainstalována. Určitě mi uvěříte mé uklidnění.
Návratová hodnota z SqlParameter
Jak předcházející odstavce souvisí se zmíněnou třídou SqlParameter? Ve verzi .net frameworku 2.0 se změnil datový typ, který je navrácen při volání dotazu z jednoduchého hodnotového typu na ekvivalentní Sql strukturu. Pro získání návratové hodnoty tak použijeme zápis:
SqlInt32 result = (SqlInt32)outpuParameter.Value;
Důvod vyvolání výjimky System.InvalidCastException byl tedy ozřejmen a po doinstalování požadované verze vše začalo sprvávně pracovat.
Dalším odhalením pak byla skutečnost, že .net framework 2.0 v průběhu své instalace vytvoří zároveň i adresáře pojmenované po předchozích verzích frameworku. Tím je však zabráněno možnosti snadno identifikovat všechny nainstalované verze frameworku. A tím také došlo nejen k mému zmatení a nutnosti odhalovat další zákoutí vývoje pro .net.
Otázka: Znáte lepší způsob pro zjištění všech instalovaných verzí .netu?
Pod čarou
Nejsem si jistý správností tohoto tvrzení, ale je pravdou, že .net 2.0 využívá některých knihoven z předchozích verzí a tyto zároveň s instalací kopíruje do správných adresářů.(?)
1 Comment
Michal said
<p><a href="http://addressof.com/blog/articles/FrameworkVersionInfo.aspx" rel="nofollow" target="_new">http://addressof.com/blog/articles/FrameworkVersionInfo.aspx</a></p>