Porównywanie obiektów za pomocą DataReader...

0

Mam mały problem. Mianowicie chodzi o to, że po stronie Servera bazy danych (Microsoft SQL Server 2005) mam tabelę Pracownicy. Po stronie aplikacji mam formę z Text Box-ami odpowiadającymi kolejno za login i hasło dla użytkownika. Do bazy łączę się jakimś "uniwersalnym loginem" który ma wgląd tylko na tą tabelę. Następnie próbuję odszukać w tabeli czy użytkownik o podanym loginie istnieje. Korzystam w tym celu z obiektu DataReader. Poniżej część kodu z którym mam problem.

...
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT* FROM dbo.Pracownicy";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (textBoxLogin.Text == dr.GetString(dr.GetOrdinal("login")))
{
if (textBoxHaslo.Text == dr.GetString(dr.GetOrdinal("haslo")))
{
if ((int)dr["uprawnienia"] == 0)
{
Application.Run(new Form_administrator());
conn.Close();
dr.Close();
Form_Logowanie.ActiveForm.Close();
}
else
{
Application.Run(new Form_uzytkownik());
conn.Close();
dr.Close();
Form_Logowanie.ActiveForm.Close();
}
}
}
}
MessageBox.Show("Niemożna znaleŹć uzytkownika o podanym loginie\nSprawdz czy podany login i hasło nie zawierają błędów ", "Uwaga!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
dr.Close();
conn.Close();

problem polega na tym, że nigdy nie może odszukać użytkownika o podanym loginie i haśle zawsze wyświetla komunikat z ostatniego MessageBox-a.

Błagam o pomoc! Ja w tym nic źle nie widzę a pilnie potrzebuję prawidłowe rozwiązanie.

0

a nie możesz zrobić jak normalny człowiek, czyli select * from pracownicy where login = 'jakislogin' and pass = 'jakispass' i sprawdzić czy zapytanie coś zwróciło czy nie :>

0

Mogę tak zrobić (nawet mogę napisać funkcję po stronie serwera do tego lub na przynajmniej 3 inne sposoby to zrobić) z tym, że ja chcę po prostu wiedzieć czemu mi to nie działa!! typy danych się zgadzają kod raczej jest też dobry ale nie działa i chcę wiedzieć po prostu dlaczego się tak dzieje, że nie mogę porównać danych z poziomu aplikacji z danymi, z bazy danych. ;] i właściwie tylko mnie to interesuje!

0

spojrz na swoj kod w ten sposob:

Kuken napisał(a)
                BLAH

                while (dr.Read())
                    if (textBoxLogin.Text == dr.GetString(dr.GetOrdinal("login")))
                        if (textBoxHaslo.Text == dr.GetString(dr.GetOrdinal("haslo")))
                            if ((int)dr["uprawnienia"] == 0)
                                BLAH
                            else
                                BLAH

                MessageBox.Show("Niemożna znaleść uzytkownika o podanym loginie\nSprawdz czy podany login i hasło nie zawierają błędów ", "Uwaga!!", MessageBoxButtons.OK, MessageBoxIcon.Error);

                BLAH

i teraz, na podstawie wiedzy o petlach, if-ach i else-ach powiedz: kiedy linijka MessageBox sie NIE wykona :)

inne mysli włochate:

  • moze haslo po stronie bazy jest szyfrowane i proste .Text == nie przejdzie?
  • na pewno nie problem z upper/lower case?
  • moze baza trzyma user/pass jako CHAR(50) zamiast VARCHAR(50) i zwraca Ci wiele spacji wokol - probowales oba stringi trimowac?
0

odp. kiedy login i hasło będą znajdować się w bazie :-D (warunek zostanie spełniony więc forma sie zamknie i messagebox nie wejdzie :-) a nawet jeśli nie mam racji to przy spełnionym warunku powinny się otworzyć poszczególne formy a dopiero potem powinien messagebox się wyświetlić a sie nie otwierają [glowa] a mess wchodzi zawsze ) w każdym razie dzięki za te wskazówki poniżej są już konkretniejsze [green] (uczę się dopiero ADO.NET i sobie po prostu kombinuję [green] )

0

Dzięki kolo miałeś rację. Miałem login i hasło w bazie ustawione jako CHAR i dodawało mi spacje na końcu [green] wystarczyło .Trim() i wszystko działa. Wielkie dzięki za pomoc. [browar] należy się!!

0

no to super:)
a co do mboxa to krotkie psst.. to ze forma sie schowa to nie znaczy ze program/metoda/funkcja/petla sie automagicznie przerwa ;) one leca i wykonuja sie dalej

1 użytkowników online, w tym zalogowanych: 0, gości: 1