none
classe sql che genera eccezione non gestita RRS feed

  • Domanda

  • Ho il seguente programmino:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using rubrica;
    namespace test
    {
        public partial class Form1 : Form
        {
            Rubrica MiaRubrica;
            public Form1()
            {
                InitializeComponent();
                MiaRubrica = new rubrica.Rubrica();
            }
    
            private void submit_Click(object sender, EventArgs e)
            {
               MiaRubrica.Add( Cognome.Text+";"+Nome.Text+";"+Telefono.Text);
               MiaRubrica.Save();
               Cognome.Text = "";
               Nome.Text = "";
               Telefono.Text = "";
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string Stringa = MiaRubrica.Find(Cerca.Text);
               if(Stringa!="Not found"){
                    string[] Dati = Stringa.Split(';');
                    Cognome.Text = Dati[0];
                    Nome.Text = Dati[1];
                    Telefono.Text =Dati[2];
                    Cerca.Text = "";
               }
                else{
                    Cognome.Text = "Risultato non trovato";
                    Nome.Text = "Risultato non trovato";
                    Telefono.Text = "Risultato non trovato";
                    Cerca.Text = "";
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                MiaRubrica.Remove(Cognome.Text + ";" + Nome.Text + ";" + Telefono.Text);
                MiaRubrica.Save();
                Cognome.Text = "";
                Nome.Text = "";
                Telefono.Text = "";
            }
        }
    }
    

    Gestito dalla seguente classe:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace rubrica
    {
        public class Rubrica
        {
            
    
            public string Find(string cerca)
            {
                           DataSet ds = new DataSet();
                try
                {
                   SqlConnection sqlConn = new SqlConnection("Data Source=PC-ADOLFO\\SQLEXPRESS;Initial Catalog=rubrica;Integrated Security=True");
                SqlCommand sqlCmd;
                string sql="SELECT * FROM dbo.agenda WHERE Cognome LIKE '%"+cerca+"%' OR  Nome LIKE '%"+cerca+"%' OR Telefono LIKE '%"+cerca+"%'";
                sqlCmd = new SqlCommand(sql, sqlConn);
                sqlCmd.Connection.Open();
                SqlDataReader dr = sqlCmd.ExecuteReader();
    
                    if (dr.Read())
                        return dr.ToString();
                    else
                         return "Not found";
                   
                }
                catch (SqlException se)
                {
                    throw (se);
                }
    
            }
            public bool Add(string ToInsert)
            {
                try
                {
                    SqlConnection sqlConn = new SqlConnection("Data Source=PC-ADOLFO\\SQLEXPRESS;Initial Catalog=rubrica;Integrated Security=True");
                    SqlCommand sqlCmd;
                    string[] dati = ToInsert.Split(';');
                    string sql = "INSERT INTO dbo.agenda (Nome, Cognome, Telefono)";
                    sqlCmd = new SqlCommand(sql, sqlConn);
                    sqlCmd.Connection.Open();
                    int nRow = sqlCmd.ExecuteNonQuery();
                    return true;
                }
                    catch (SqlException se)
                {
                    throw (se);
    
                }
                
            
            public bool Remove(string ToRemove)
            {
                try
                {
                    SqlConnection sqlConn = new SqlConnection("Data Source=PC-ADOLFO\\SQLEXPRESS;Initial Catalog=rubrica;Integrated Security=True");
                    SqlCommand sqlCmd;
                    string[] dati = ToRemove.Split(';');
                    string sql = "DELETE FROM dbo.agenda WHERE Nome="+dati[1]+"";
                    sqlCmd = new SqlCommand(sql, sqlConn);
                    sqlCmd.Connection.Open();
                    int nRow = sqlCmd.ExecuteNonQuery();
                    return true;
                }
                catch (SqlException se)
                {
                    throw (se);
    
                }
            }
            public void Save()
            {
                
            }
           
            
        }
    }
    

    quando il programma richiama un metodo però il debugger mi segnala la seguente eccezione
    Eccezione non gestita di tipo 'System.Data.SqlClient.SqlException' in rubrica.dll


    Mi potete aiutare?

    martedì 21 aprile 2015 08:14

Risposte

  • Ciao Abe,

    allora un paio di cose intanto nei metodi della tua classe rubrica tu intercetti la tua SqlException ma ne fai il rethrow, quindi diciamo che propagi l'eccezione al livello "superiore" della tua applicazione che è nel tuo caso il tuo FORM che non gestisce l'eccezione e da qui la segnalazione che hai.

    Intanto o intercetti e gestisci l'eccezione nella tua classe rubrica o se la fai propagare al livello superiore devo gestirla anche li.

    Altro appunto così facendo tu intercetti solo le eccezioni di tipo sqlexception e tutte le eventuali tua altre eccezioni verrebbero propagate alla tua classe chiamante senza essere gestite.

    Se ti serve una gestione particolare dell'eccezione tipizzata va bene intercettarla per tipo come hai fatto altrimenti intercetta l'eccezione generica Exception. Nel tuo caso premettendo che vuoi una gestione ad hoc per le eccezioni di tipo SqlException potresti fare qualcosa del genere :

                try
                {
    
                }
                    catch (SqlException sqlExec)
                {
                     //Gestione ad hoc dell'eccezione sql
                }
            catch (Exception genericException)
                {
                    throw;
                }

    Ricorda che se fai un throw dell'eccezione la stessa deve essere gestita anche al livello superiore.

    x esempio :

            private void submit_Click(object sender, EventArgs e)
            {
               try{
               MiaRubrica.Add( Cognome.Text+";"+Nome.Text+";"+Telefono.Text);
               MiaRubrica.Save();
               Cognome.Text = "";
               Nome.Text = "";
               Telefono.Text = "";
               }
               catch(Exception ex)
               {
                 //Gestione ad hoc dell'errore
               }
            }

    martedì 21 aprile 2015 08:56

Tutte le risposte

  • Ciao Abe,

    allora un paio di cose intanto nei metodi della tua classe rubrica tu intercetti la tua SqlException ma ne fai il rethrow, quindi diciamo che propagi l'eccezione al livello "superiore" della tua applicazione che è nel tuo caso il tuo FORM che non gestisce l'eccezione e da qui la segnalazione che hai.

    Intanto o intercetti e gestisci l'eccezione nella tua classe rubrica o se la fai propagare al livello superiore devo gestirla anche li.

    Altro appunto così facendo tu intercetti solo le eccezioni di tipo sqlexception e tutte le eventuali tua altre eccezioni verrebbero propagate alla tua classe chiamante senza essere gestite.

    Se ti serve una gestione particolare dell'eccezione tipizzata va bene intercettarla per tipo come hai fatto altrimenti intercetta l'eccezione generica Exception. Nel tuo caso premettendo che vuoi una gestione ad hoc per le eccezioni di tipo SqlException potresti fare qualcosa del genere :

                try
                {
    
                }
                    catch (SqlException sqlExec)
                {
                     //Gestione ad hoc dell'eccezione sql
                }
            catch (Exception genericException)
                {
                    throw;
                }

    Ricorda che se fai un throw dell'eccezione la stessa deve essere gestita anche al livello superiore.

    x esempio :

            private void submit_Click(object sender, EventArgs e)
            {
               try{
               MiaRubrica.Add( Cognome.Text+";"+Nome.Text+";"+Telefono.Text);
               MiaRubrica.Save();
               Cognome.Text = "";
               Nome.Text = "";
               Telefono.Text = "";
               }
               catch(Exception ex)
               {
                 //Gestione ad hoc dell'errore
               }
            }

    martedì 21 aprile 2015 08:56
  • Grazie ho imparato a gestire le eccezioni a livello superiore con i message box, grazie.
    giovedì 23 aprile 2015 13:43
  • Ciao,

    ricorda che in SQL server il carattere apice (') è utilizzato per indicare una stringa.

    La soluzione ottimale è quella di utilizzare sempre Command con parametri anche per evitare problemi di SQL Injection.

    In alternativa devi assicurarti che eventuali caratteri apice contenuti nella stringa vengano raddoppiati, ad esempio

    "DELETE FROM dbo.agenda WHERE NOME = '" + dati[1].Replace("'", "''") + "'"

    o meglio

    string.Format("DELETE FROM dbo.agenda WHERE NOME = '{0}'", dati[1].Replace("'", "''"))


    Gianluca Riva

    venerdì 24 aprile 2015 16:04