» Poradna » Programy

ASP.NET + OleDbCommand

 |   | 

Zdravím všechny...Mám problém s ověřováním userů z DB v Accessu v mojí asp.net aplikaci.Pro ověření si vytvářím OleDbCommand a typ přiřazuji StoredProcedure. Z aplikace si naplním OleDbParameter a pak volám uloženou proceduru pomocí ExecuteScalar.Když spustím uloženou proceduru v Accessu tak funguje normálně (při nalezení Usera vrací jeho ID jinak vrací 0). Při spuštění aplikace a ověřování Usera na web formuláři obdržím při nenalezení Usera chybové hlášení :System.NullReferenceException: Object reference not set to an instance of an object.Přitom při jeho nalezení aplikace pracuje korektně.Nevím, kde dělám chybu, snad v použití ExecuteScalar (která má vracet první nalezenou hodnotu).Přikládám kód metody Login :public int Login(string strUzivJmeno, string strHeslo) { int intId; object result; OleDbCommand objCmd = new OleDbCommand("spLoginUser", objConn); objCmd.CommandType = CommandType.StoredProcedure; OleDbParameter objParam = new OleDbParameter("@UzivJmeno", OleDbType.Char); objParam.Value = strUzivJmeno; objCmd.Parameters.Add(objParam); objParam = new OleDbParameter("@Heslo", OleDbType.Char); objParam.Value = strHeslo; objCmd.Parameters.Add(objParam); try { objConn.Open(); result = objCmd.ExecuteScalar(); objConn.Close(); } catch (Exception e) { throw e;} if ((int)result intId = 0; else intId = (int)result; return intId; }a SQL dotaz :SELECT tblUzivatele.IDUzivateleFROM tblUzivateleWHERE (((tblUzivatele.UzivJmeno)=[@UzivJmeno]) AND ((tblUzivatele.Heslo)=[@Heslo]));Prosím o pomoc...

Mohlo by vás také zajímat

Odpovědi na otázku

 | 

if ((int)result Áno, treba testovať, či nie je result == null.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Takže i když testuji tohle : if (result == null) tak stále mi to vyhazuje stejnou chybu. Myslím že chyba nastává při nenalezení Usera v DB a ExecuteScalar si s tím neumí nějak poradit ...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Pri nenájdení používateľa v databáze nevráti uložená procedúra žiadne záznamy a volanie ExecuteScalar vráti hodnotu null, t.j. result == null.Ja by som to zapísal takto: intId = (result != null? (int) result: 0);Chyba môže byť aj niekde úplne inde (nie je objConn nastavené na null?), mal by si však vedieť riadok, na ktorom sa vyskytla.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Takže ani tohle testování na null nezamezí dříve popisovaneé chybě. Debugger oznamí chybu na řádku č. 57, avšak na tom řádku mám jenom komentář a žádný kód. Navíc, když jsem tuto chybu testoval, tak se debugger stále odkazoval na stejný řádek, ač se rozvržení kódu několikrát změnilo...Jediné vodítko mi teda zůstalo v podobě výpisu ze zásobníku, kde je na předposledním řádku volaná metoda Login stránky login.aspx a na posledním řádku je volaná metoda Login třídy User ... z toho soudím, že bude chyba někde v ní.... nakonec chybu mi to vyhodí oři přihlašování neexistujícího uživatele...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Ak debugger oznámi chybu na riadku, v ktorom je len komentár, tak zrejme nedebuguješ tú knižnicu, ktorú by si chcel. Pri kompilovaní nenastali žiadne chyby? Skontroluj si čas vytvorenia knižnice, ktorú vytvoril kompilátor, prípadne vymaž všetky dočasné súbory a prekompiluj znova.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Noooo, v tom bude možná problém, protože když dám "Rebuild projekt" a "Rebuild Solution" tak se v adresáři Projekt/BIN nevytvoří knihovna Projekt.dll a pak debugger skončí chybou :Typ Projekt.Global nelze přečíst.Řádek 1:

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Aké chyby sa vyskytli pri kompilácii? Ak používaš Visual Studio, tak si pozri, čo sa píše pri kompilácii do záložky Output - môže Ti to pomôcť odhaliť problém.Skontroluj si namespace v global.asax.cs (mne sa napr. nepáči, že tam máš Inherits="Kalkulace.Global" a chýba mu Projekt.Global).

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

výpis z Output po kompilaci :------ Build started: Project: Kalkulace, Configuration: Debug .NET ------Preparing resources...Updating references...Performing main compilation...c:\inetpub\wwwroot\kalkulace\user.cs(106,8): warning CS0168: The variable 'intId' is declared but never usedc:\inetpub\wwwroot\kalkulace\user.cs(107,20): warning CS0168: The variable 'objReader' is declared but never usedC:\Inetpub\wwwroot\Kalkulace\Zakazka.cs(53,52): error CS0165: Use of unassigned local variable 'strSPName'C:\Inetpub\wwwroot\Kalkulace\Zakazka.cs(158,20): warning CS0168: The variable 'objReader' is declared but never usedC:\Inetpub\wwwroot\Kalkulace\Zakazka.cs(190,20): warning CS0168: The variable 'objReader' is declared but never usedBuild complete -- 1 errors, 4 warningsBuilding satellite assemblies...Satellite assemblies could not be built because the main project output is missing.---------------------- Done ---------------------- Build: 0 succeeded, 1 failed, 0 skipped

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | 

Neviem, ako rozumieš po anglicky, ale z tohto výpisu:C:\Inetpub\wwwroot\Kalkulace\Zakazka.cs(53,52): error CS0165: Use of unassigned local variable 'strSPName'je zrejmé, že používaš nenainicializovanú premennú strSPName - to je chyba, kvôli ktorej sa to neskompiluje. Takže si to oprav.Ostatné sú varovania, že deklaruješ premenné, ktoré nikde nepoužívaš.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

OK, ten výstup z debugu jsem si přeložil, ale myslel jsem, že to zkompiloval i s tou chybou ... Teď mi to píše chybu zase jinou, ale tu jdu teprve pořešit... Zatím díky za nasměrování "doufám" správným směrem.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Result, Nalezení, Exception e, Catch, Instance