C# łączenie z SQL

0

Witam
Dopiero zaczynam programować i trafiłem na błąd którego nie mogę przeskoczyć od 3h, mianowicie zrobiłem sobie według poradnika panel do logowania, ale podczas wpisywania Nazwy Użytkownika i hasła zawsze wyskakuje "Wpisz prawidłowe dane" , mimo iż na 100% wpisuje to co utworzyłem w bazie danych.
Bardzo proszę o pomoc.

SqlConnection sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Pawel\Documents\LoginDB.mdf;Integrated Security=True;Connect Timeout=30");
string query = "SELECT Id, User, Password FROM [Table]";
query += " WHERE(User=@User) AND (Password=@Password)";
sqlcon.Open();
SqlCommand cc = new SqlCommand();
SqlDataReader sr;
cc.Connection = sqlcon;
cc.CommandType = CommandType.Text;
cc.CommandText = query;
cc.Parameters.Add("@User", SqlDbType.Char).Value = txtUser.Text;
cc.Parameters.Add("@Password", SqlDbType.Char, 8).Value = txtPassword.Text;

sr = cc.ExecuteReader();

if(sr.HasRows==true) {
  MessageBox.Show("Poprawnie zalogowano");
  this.Close();
  Form2 frm2 = new Form2();
  frm2.Show();
} else {
  MessageBox.Show("Wpisz prawidlowe dane");
}
1

Użyj Parameters.AddWithValue()

cc.Parameters.AddWithValue("@User", txtUser.Text);
cc.Parameters.AddWithValue("@Password", txtPassword.Text);

Nie musisz booli porównywać, wystarczy

if(sr.HasRows)
{
}

Upewnij się, że nie ma jakiś specjalnych znaków txtUser.Text oraz txtPassword.Text.

PS.
Polecam Dappera. Jak już się uczyć to w sposób nieutrudniający sobie tej nauki, a dodatkowo nauka wzbogaci się o dobre "maniery" w programowaniu na przyszłość.

0

Niektóre funkcjonalności Readera się ujawniają po pierwszym ruchu na nim. HasRows też może być takie

                    sr= cmd.ExecuteReader();

                    bool ok = sr.Read(); <-------- spróbuj to 

                   if(sr.HasRows) {
0

A odpaliłeś debuggera? Cos ci powiedział? Możesz też w profilerzez na bazie zobaczyć jakie zapytanie leci i co zwraca.

0
AnyKtokolwiek napisał(a):

Niektóre funkcjonalności Readera się ujawniają po pierwszym ruchu na nim. HasRows też może być takie

                    sr= cmd.ExecuteReader();

                    bool ok = sr.Read(); <-------- spróbuj to 

                   if(sr.HasRows) {

Podejrzenie całkiem okazuje się prawdziwe

https://stackoverflow.com/questions/46712146/hasrows-function-on-data-reader-taking-forever

0

Dziękuje wszystkim za pomoc.Generalnie musiałem coś sknocić tworząc bazę przez visual studio. Utworzyłem kolejna w SMSS i wszystko działa jak powinno :)

0
AdamWox napisał(a):

Użyj Parameters.AddWithValue()

cc.Parameters.AddWithValue("@User", txtUser.Text);
cc.Parameters.AddWithValue("@Password", txtPassword.Text);

Nie musisz booli porównywać, wystarczy

if(sr.HasRows)
{
}

Upewnij się, że nie ma jakiś specjalnych znaków txtUser.Text oraz txtPassword.Text.

PS.
Polecam Dappera. Jak już się uczyć to w sposób nieutrudniający sobie tej nauki, a dodatkowo nauka wzbogaci się o dobre "maniery" w programowaniu na przyszłość.

Dzięki za podrzucenie pomysłu. Na pewno skorzystam :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.