2 messaggi dal 17 giugno 2019
Ciao a tutti, ho un problema con un mio codice, ho creato una funzione che controlla in una pagina di inserimento campi se l'email (ed altri campi) è stata già usata, il problema è nella pagina modifica. Se nella pagina modifica non cambio l'email mi compare il messaggio che l'email è stata già usata, non riesco a trovare un controllo che mi escluda l'email nella riga che sto modificando


protected void Button2_Click(object sender, EventArgs e)
{
if (checkemail() == true)
{

Label33.Visible = true;
Label33.Text = "Questa email è già stata usata";

}
else if (Codicefiscale() == true)

{

Label34.Visible = true;
Label34.Text = "Il codice fiscale già è stato usato";
}
else
{
string query = "UPDATE Persona SET Nome = @Nome, Cognome = @Cognome, Email = @Email, CodiceFiscale = @CodiceFiscale WHERE ID = @id";
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConnection"].ToString()))
{
SqlCommand cmd = new SqlCommand(query, con);

List<SqlParameter> p = new List<SqlParameter>();

p.Add(new SqlParameter("@Nome", TextBox1.Text));
p.Add(new SqlParameter("@Cognome", TextBox15.Text));
p.Add(new SqlParameter("@Email", TextBox20.Text));
p.Add(new SqlParameter("@CodiceFiscale", TextBox22.Text));
p.Add(new SqlParameter("@ID", Id));
con.Open();
GetExample(cmd, p.ToArray());
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
Response.Redirect("Dash.aspx");
}
}
}


qua sotto metto la funzione che ho creato


private Boolean checkemail()
{
Boolean emailavailable = false;
String mycon = "Data Source=DESKTOP-LORL4DL;Initial Catalog=Databasepersone;Integrated
Security=True;Pooling=False";
String myquery = "Select Email from Persona where Email='" + TextBox20.Text + "'";
SqlConnection con = new SqlConnection(mycon);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = myquery;
cmd.Connection = con;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
emailavailable = true;

}
con.Close();

return emailavailable;

}
Modificato da elmachico il 17 giugno 2019 14:50 -
11.886 messaggi dal 09 febbraio 2002
Contributi
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 -

Enjoy learning and just keep making
2 messaggi dal 17 giugno 2019
Ciao ti ringrazio per la risposta dettagliata,sono agli inizi e so che dovrei essere più ordinato devo abituarmi a questa cosa anche per un vantaggio in fase di errori.
Comunque funziona, grazie mille

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.