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 |
[C#] Inserare in baza de date pe baza de email unic
Last Updated: Apr 04 2017 15:21, Started by
GlontzZz
, Apr 01 2017 19:55
·
0
#1
Posted 01 April 2017 - 19:55
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
Posted 01 April 2017 - 21:32
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
Posted 01 April 2017 - 21:59
dani.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
Posted 01 April 2017 - 22:03
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
Posted 02 April 2017 - 19:32
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!"); } } |
#7
Posted 02 April 2017 - 19:45
Si acel rezultat returnat il pastrez intr-un int / bool?
|
#8
Posted 02 April 2017 - 19:53
Rezultatul va fi numarul de inregistrari numarate, un int. Daca-i > 0. mai sunt clieni cu acel email.
|
#9
Posted 02 April 2017 - 19:56
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(); } } |
#11
Posted 02 April 2017 - 20:01
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
Posted 02 April 2017 - 23:22
GlontzZz, 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
Posted 03 April 2017 - 18:22
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
Posted 03 April 2017 - 18:55
Nu stiu cum, am reusit sa fac verificarea pentru existenta, dar acum am probleme la inserare, nu imi introduce nicio inregistrare noua.
|
#17
Posted 03 April 2017 - 20:10
Afiseaza connection string-ul, cu user/parola cenzurate.
|
#18
Posted 03 April 2017 - 20:16
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
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users