Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Imprimanta ciss rezista perioade ...

Garmin fēnix 7 / PRO / Saphi...

Care sunt cele mai mari regrete a...

Alfa Romeo Stelvio 2.2 jtd
 Intrebari srl nou

La multi ani @AndReW99!

Alegere masina £15000 uk

TVR vrea sa lanseze o platforma d...
 Strategie investie pe termen lung...

Modulator FM ptr auto alimentat p...

orange cablu f.o. - internet fara...

Robinet care comuta traseul
 A fost lansata Fedora 40

Samsung S24 plus

Imi iau un Dell? (Vostro vs others)

Abonati Qobuz?
 

[C#] Inserare in baza de date pe baza de email unic

- - - - -
  • Please log in to reply
20 replies to this topic

#1
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Incerc sa inserez un user intr-o baza de date, conditiile de validare sunt urmatoarele:
- email-ul sa fie valid
- email-ul sa fie unic (O persoana poate crea mai multe conturi cu aceleasi date, dar pe email-uri diferite)

Ideea e ca nu imi iese inserarea si nu inteleg de ce... Ma chinui cu debugger-ul de pe la ora 2 si tot nu am reusit sa modific nici macar un punct si virgula, pentru ca nu imi dau seama unde e greseala...
Codul e aici:

Spoiler


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
La insert ai pus frumos parametrii, iar la query ai dat cu concentare sa fii vulnerabil direct la injection...

Lasa baza de date se se ocupe de unicitate. Pui index unicat pe coloana respectiva iar din cod inserezi. Daca mai exista deja, iti da baza de date eroare si reactionezi in conseciinta.

#3
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014

View Postdani.user, on 01 aprilie 2017 - 21:32, said:

La insert ai pus frumos parametrii, iar la query ai dat cu concentare sa fii vulnerabil direct la injection...

Sunt constient de asta, doar ca vreau sa vad cum pot sa il fac sa functioneze in modul asta. Nu e pentru o aplicatie, unde da, as fi folosit indexarea unica, doar voiam sa vad cum pot face asta prin a verifica manual.

#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Conditia HasRows e aiurea. COUNT(*) iti returneaza mereu un rand, chiar daca valoarea e 0. Pune ExecuteScalar sa citesti direct valoare returnata. Verificarea reader != null deasemenea e inutila. Ori primesti ceva ori arunca exceptia.

#5
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Am incercat asta, dar degeaba. Nu reusesc sa inteleg cum sa o fac... Ideea o am in cap, dar nu imi iese implementarea, n-am reusit sa inteleg cum verific existenta unei inregistrari in baza de date... Cel putin nu in C#, inca. Am incercat sa scot asta, dar degeaba:

using (SqlConnection connection = new SqlConnection(connectionString))
				using (SqlCommand command = new SqlCommand("SELECT * FROM Clienti WHERE email = '@emailCheck'", connection)) {
					command.Parameters.AddWithValue("@emailCheck", txtAdresaEmail.Text);
					connection.Open();
					SqlDataReader reader = command.ExecuteReader();
					if (!reader.Read()) {
						reader.Close();
						command.CommandText = "INSERT INTO Clienti VALUES ('@parola', '@nume', '@prenume', '@adresa', '@email', @kcal_zilnice)";
						command.Parameters.AddWithValue("@parola", txtParola.Text);
						command.Parameters.AddWithValue("@nume", txtNume.Text);
						command.Parameters.AddWithValue("@prenume", txtPrenume.Text);
						command.Parameters.AddWithValue("@adresa", txtAdresa.Text);
						command.Parameters.AddWithValue("@email", txtAdresaEmail.Text);
						command.Parameters.AddWithValue("@kcal_zilnice", 0);
						command.ExecuteNonQuery();
						MessageBox.Show("Inregistrare efectuata cu succes!", "Bun venit!");
					}
				   
				}



#6
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Ti-am scris mai sus... count(*) + ExecuteScalar

#7
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Si acel rezultat returnat il pastrez intr-un int / bool?

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Rezultatul va fi numarul de inregistrari numarate, un int. Daca-i > 0. mai sunt clieni cu acel email.

#9
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Am incercat, nu merge... Primesc mesajul de "Inregistrare efectuata" indiferent de datele pe care le introduc, fie ca sunt sau nu existente in baza de date, dar nu reusesc sa vad nicio modificare in tabela Clienti din db.

private void btnInregistrare_Click(object sender, EventArgs e) {
			if (!isValidEmail(txtAdresaEmail.Text)) {
				MessageBox.Show("Adresa de email nu este valida", "Eroare!");
			} else if (txtParola.Text != txtReintroducereParola.Text) {
				MessageBox.Show("Parolele nu coincid", "Eroare!");
			} else {
				using (SqlConnection connection = new SqlConnection(connectionString))
				using (SqlCommand command = new SqlCommand("SELECT COUNT(*) FROM Clienti WHERE email = '@emailCheck'", connection)) {
					command.Parameters.AddWithValue("@emailCheck", txtAdresaEmail.Text);
					connection.Open();
					Int32 t = Convert.ToInt32(command.ExecuteScalar());
					if (t < 1) {
						command.CommandText = "INSERT INTO Clienti VALUES ('@parola', '@nume', '@prenume', '@adresa', '@email', @kcal_zilnice)";
						command.Parameters.AddWithValue("@parola", txtParola.Text);
						command.Parameters.AddWithValue("@nume", txtNume.Text);
						command.Parameters.AddWithValue("@prenume", txtPrenume.Text);
						command.Parameters.AddWithValue("@adresa", txtAdresa.Text);
						command.Parameters.AddWithValue("@email", txtAdresaEmail.Text);
						command.Parameters.AddWithValue("@kcal_zilnice", 0);
						command.ExecuteNonQuery();
						MessageBox.Show("Inregistrare efectuata cu succes!", "Bun venit!");
					}
				   
				}
				this.Close();
			}
		}



#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Verifici aceeasi baza de date?

#11
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Da. Conexiunea e realizata okay. Incerc sa mai fac un proiect nou, sa vad, dar sunt 99% sigur ca nu am gresit nimic la configurare.

L.E.: variabila t (cea in care retin COUNT-ul) e 0, indiferent daca mail-ul exista deja sau nu, nu inteleg de ce.

Edited by GlontzZz, 02 April 2017 - 20:07.


#12
sergiu_psc

sergiu_psc

    Member

  • Grup: Members
  • Posts: 880
  • Înscris: 08.01.2008

View PostGlontzZz, on 02 aprilie 2017 - 19:56, said:

Am incercat, nu merge... Primesc mesajul de "Inregistrare efectuata" indiferent de datele pe care le introduc, fie ca sunt sau nu existente in baza de date, dar nu reusesc sa vad nicio modificare in tabela Clienti din db.

private void btnInregistrare_Click(object sender, EventArgs e) {
		 if (!isValidEmail(txtAdresaEmail.Text)) {
			 MessageBox.Show("Adresa de email nu este valida", "Eroare!");
		 } else if (txtParola.Text != txtReintroducereParola.Text) {
			 MessageBox.Show("Parolele nu coincid", "Eroare!");
		 } else {
			 using (SqlConnection connection = new SqlConnection(connectionString))
			 using (SqlCommand command = new SqlCommand("SELECT COUNT(*) FROM Clienti WHERE email = '@emailCheck'", connection)) {
				 command.Parameters.AddWithValue("@emailCheck", txtAdresaEmail.Text);
				 connection.Open();
				 Int32 t = Convert.ToInt32(command.ExecuteScalar());
				 if (t < 1) {
					 command.CommandText = "INSERT INTO Clienti VALUES ('@parola', '@nume', '@prenume', '@adresa', '@email', @kcal_zilnice)";
					 command.Parameters.AddWithValue("@parola", txtParola.Text);
					 command.Parameters.AddWithValue("@nume", txtNume.Text);
					 command.Parameters.AddWithValue("@prenume", txtPrenume.Text);
					 command.Parameters.AddWithValue("@adresa", txtAdresa.Text);
					 command.Parameters.AddWithValue("@email", txtAdresaEmail.Text);
					 command.Parameters.AddWithValue("@kcal_zilnice", 0);
					 command.ExecuteNonQuery();
					 MessageBox.Show("Inregistrare efectuata cu succes!", "Bun venit!");
				 }
				
			 }
			 this.Close();
		 }
	 }



Ai reusit pana la urma sa gasesti eroarea?

Incearca asta:

SqlCommand command = new SqlCommand("SELECT COUNT(*) FROM Clienti WHERE email = @emailCheck", connection)


Nu am testat, dar nu cred ca ai nevoie de apostrofi la @emailCheck.

#13
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Am incercat si intr-un nou proiect, si degeaba, baza de date noua... Imi returneaza acel 0 la Count() indiferent de situatie. Ideea e ca daca execut query-ul manual, separat, pe baza de date, merge fara probleme.

#14
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Nu stiu cum, am reusit sa fac verificarea pentru existenta, dar acum am probleme la inserare, nu imi introduce nicio inregistrare noua.

#15
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Pune explicit coloanele la inserare.

#16
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Degeaba, tot nu are loc inregistrarea...

Spoiler


#17
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Afiseaza connection string-ul, cu user/parola cenzurate.

#18
GlontzZz

GlontzZz

    Active Member

  • Grup: Members
  • Posts: 1,288
  • Înscris: 08.02.2014
Connection String-ul il initializez asa:
connectionString = ConfigurationManager.ConnectionStrings["TestTT.Properties.Settings.DBConnectionString"].ConnectionString;
si arata cam asa:
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DB.mdf;Integrated Security=True



Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate