|
Programiranje Java, Perl, VB, ASP, .NET, C, C++, Pascal, Delphi Sponzor: |
|
Alati teme | Način prikaza |
04. 04. 2013. | #1 |
član
Certified
|
Login kontrola u Windows wormama C#
Da li neko zna kako moze da se napravi najprostija Login kontrola sa bazom za Windows aplikaciju. Probao sam na sledeci nacin, i uspeo sam ali ne umem da dodelim odredjene opcije odredjenim user-ima.
bool isValidateUser = false; SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=LoginDatabase;Integrated Security=True"); SqlDataAdapter adapter = new SqlDataAdapter(); SqlCommand command = new SqlCommand("select UserName, Password from Users where UserName=@UserName and Password=@Password",connection); command.Parameters.AddWithValue("@UserName", txtUsername.Text); command.Parameters.AddWithValue("@Password", txtPassword.Text); adapter.SelectCommand = command; DataSet userDetails = new DataSet(); adapter.Fill(userDetails, "Users"); foreach (DataRow dr in userDetails.Tables["Users"].Rows) { if ((Convert.ToString(dr["UserName"]) == txtUsername.Text) && (Convert.ToString(dr["Password"]) == txtPassword.Text)) { Form1 frm = new Form1(); frm.ShowDialog(); isValidateUser = true; break; } else { MessageBox.Show("Neuspesno logovanje"); } } ... e sad kada mi se otvori prozor Form1, sve sto meni treba jeste da mi se u comboBox kontroli automatski selektuje ulogovani User. Da li neko moze da pomogne? Hvala.
__________________
tO sAm jA i Tu jE ProBleM, sIlOm NeĆu Da sE mEnJam... |
04. 04. 2013. | #2 |
Dejan Katašić
Wrote a book
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
|
Ako nije problem, molio bih za pojašnjenje koda jer nisam upućen u detalje predstavljene tehnologije. Najnejasnije mi je na sledećem momentu:
Kôd:
adapter.SelectCommand = command; DataSet userDetails = new DataSet(); adapter.Fill(userDetails, "Users"); Sledi potom deklaracija dataseta i kaže da ga napunimo (pretpostavljam) onim što je u tabeli Users. Pratim li dobro? Ili se na neki način tu primenjuje već pripremljena SelectCommand? |
05. 04. 2013. | #3 |
član
Certified
|
Kôd:
SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=LoginDatabase;Integrated Security=True");//konekcioni string SqlDataAdapter adapter = new SqlDataAdapter();//srednji sloj koji se puni pozivom odnosno metodom SqlCommand command = new SqlCommand("select UserName, Password from Users where UserName=@UserName and Password=@Password",connection);//query, kao store procedure ili nesto slicno command.Parameters.AddWithValue("@UserName", txtUsername.Text); command.Parameters.AddWithValue("@Password", txtPassword.Text); adapter.SelectCommand = command;//puni srednji sloj, komandom odnosno query-jem iz SqlCommand-e DataSet userDetails = new DataSet(); adapter.Fill(userDetails, "Users")//dodavanje ili refresh-ovanje kolone u dataSetu preko srednjeg sloja
__________________
tO sAm jA i Tu jE ProBleM, sIlOm NeĆu Da sE mEnJam... |
"Hvala" Darkonyks za poruku: |
05. 04. 2013. | #4 |
Dejan Katašić
Wrote a book
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
|
Znači... Adapter puni UserDetails u tabelu Users podatke koje dobije izvršavanjem command?
Ako je tako, imaćemo u UserDetails najviše jedan zapis (uz pretpostavku da je UserName unique polje u tabeli Users, drugačije mi ne deluje logično za korisnički sistem). Čemu onda foreach? (ako grešim kako sve ovo radi, voleo bih da znam gde sam omašio) |
"Hvala" noviKorisnik za poruku: |
05. 04. 2013. | #5 |
član
Certified
|
Obrnuto, DataSet (userDetails) po izvrsavanju upita (command), rezultate prikazuje u SqlDataAdapter (adapter).
Ukoliko postoji samo jedan unique zapis, da u pravu si nije neophodan foreach, ali nesto volim da ga koristim moglo je i ovako: Kôd:
if (userDetails.Tables["Users"].Rows.Count > 0) { isValidateUser = true; }
__________________
tO sAm jA i Tu jE ProBleM, sIlOm NeĆu Da sE mEnJam... |
06. 04. 2013. | #6 |
Dejan Katašić
Wrote a book
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
|
Dobro, idemo dalje. Stigli do
Kôd:
Form1 frm = new Form1(); frm.ShowDialog(); Kôd:
frm.SetUser(txtUsername.Text); Kôd:
public void SetUser(string userName) { comboBox.SelectedIndex = comboBox.Items.IndexOf(userName); } |
06. 04. 2013. | #7 |
član
Certified
|
Metoda funkcionise kada se comboBox-u dodaju Items (EditItems=pa upisati kolekciju), ali ne i kada se podaci izvlace iz baze.
__________________
tO sAm jA i Tu jE ProBleM, sIlOm NeĆu Da sE mEnJam... |
07. 04. 2013. | #8 |
Dejan Katašić
Wrote a book
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
|
Znači da je comboBox vezan opet za neki drugi DataSet (ili slično) sa svim ili nekim korisnicima. Tako on ne sadrži kolekciju stringova već nekih (meni nepoznatih) objekata.
Ako tako pokušamo da tražimo IndexOf sa stringom, dobićemo uvek -1 za SelectedIndex... Što će kasti da smo selektovali ništa. Ideja - prođeš kroz kolekciju comboBoxa i nađeš objekat koji ima odgovarajući UserName... pa njega proslediš kao parametar u IndexOf i ima da radi. Trebalo bi da bude nešto slično sledećem: Kôd:
public void SetUser(string userName) { IEnumerator enumerator = comboBox1.Items.GetEnumerator(); while ( enumerator.MoveNext() && ((MyType)enumerator.Current).UserName != userName ) { }//prazna petlja, MoveNext radi sve potrebno try { comboBox1.SelectedIndex = comboBox1 .Items .IndexOf((MyType)enumerator.Current); } catch (InvalidOperationException e) { MessageBox.Show("Eh, nije postavljeno, evo poruke: " + e.Message); } } |
"Hvala" noviKorisnik za poruku: |
08. 04. 2013. | #9 |
član
Certified
|
Ovo je metoda kojom punim comboBox:
Kôd:
private void puniKombo() { comboBox1.DataSource = lds.Users;//lds je data set a Users je tabela. comboBox1.ValueMember = "UserName"; comboBox1.DisplayMember = "UserName"; } Ukoliko umesto MyType (ako sam dobro razumeo) ubacim puniKombo(), izlazi mi poruka "Operator && cannot be applied to operands of type bool and void". A .UserName nisam bas najbolje skapirao, da li treba da to bude polje u kome se unosi korisnicko ime (txtUserName na Login prozoru) ili nesto drugo?
__________________
tO sAm jA i Tu jE ProBleM, sIlOm NeĆu Da sE mEnJam... |
08. 04. 2013. | #10 |
Dejan Katašić
Wrote a book
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
|
Kada kažemo enumerator.Current tada znamo da se tu nalazi objekt. Ako želimo nešto dodatno da radimo sa tim objektom moramo da javimo kog je tipa da bi mogli da koristimo njegova svojstva. Zato je navedeno (MyType)enumerator.Current
A umesto MyType... svakako ne poziv metode za punjenje, već tip podataka kojom je napunjena kolekcija komba. DataSet ima Tables kolekciju tabela. Tabela Users je tipa DataTable, i opet ima kolekciju Rows, gde su elementi tipa DataRow... Ako sam dobro ispratio, umesto MyType treba da ide DataRow. A polju pristupamo preko indeksa naziva kolone, jel, ovako: Kôd:
((DataRow)enumerator.Current)["UserName"] |
|
|