Ciao e benvenuto nel forum,
fai in modo che la SELECT escluda l'id dell'utente dalla ricerca.
Cioè, anziché fare:
"Select Email from Persona where Email='" + TextBox20.Text + "'";
Fai:
String myquery = "Select Email from Persona where Email='" + TextBox20.Text + "'" AND Id<>" + Id;
Se si tratta di un nuovo utente da creare, allora fai in modo che Id valga 0, così la query sarà comunque sintatticamente valida.
Oppure fai:
String myquery = "Select Email from Persona where Email='" + TextBox20.Text + "'";
If (!string.IsNullOrEmpty(Id))
{
//Escludo l'id solo se sto aggiornando un utente esistente
myquery += " AND Id<>" + Id;
}
Comunque, dovresti lavorare un po' al codice della funzione checkemail() e fare queste migliorie.
- Usa i blocchi using per assicurarti che gli oggetti vengano correttamente distrutti;
- Usa i SqlParameter per evitare la Sql injection;
- Ottieni la connection string da configurazione (come hai fatto sopra), anziché cablarla nel codice;
- Evita SqlDataAdapter e DataSet perché qui è sufficiente usare il metodo ExecuteScalar del SqlCommand;
- Rendi la funzione riutilizzabile facendole ricevere dei parametri anziché tenere riferimenti a controlli e campi privati;
- Indenta il codice in maniera appropriata per una migliore leggibilità;
- Dai un nome alla funzione che aiuti a capire meglio cosa fa e rispetta la naming convention di C#.
Ecco come potrebbe essere riscritta.
private bool EmailExists(string email, int id = 0)
{
string connectionString = ConfigurationManager.ConnectionStrings["dbConnection"];
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM Persona WHERE Email=@Email AND Id<>@Id";
cmd.Parameters.AddWithValue("Email", email);
cmd.Parameters.AddWithValue("Id", id);
int result = (int) cmd.ExecuteScalar();
return result > 0;
}
}
}
e la usi così:
string email = Email.Text;
int id = Id;
if (EmailExists(email, id))
{
ResultMessage.Visible = true;
ResultMessage.Text = "Questa email è già stata usata";
}
Cura le tue pagine. Non dovresti avere controlli chiamati Label33 e TextBox20. Se un domani dovrai passare il tuo lavoro a qualcun altro, avrà l'impressione che tu abbia fatto un lavoro sbrigativo e perciò di cattiva qualità.
ciao,
Moreno
Modificato da BrightSoul il 17 giugno 2019 19:34 -