n° 219
Novembre 2017
Dicembre 13, 2017, 05:37:57 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Problema con blocco catch  (Letto 3018 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
danyw3b
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 35

pk136zu@hotmail.com
Mostra profilo
« inserita:: Ottobre 02, 2014, 11:06:53 »

Ecco il mio codice:

Codice:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;

public partial class connessione : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnectionStringBuilder conn = new SqlConnectionStringBuilder();
        conn.DataSource = "localhost\\SQLExpress";
        conn.InitialCatalog = "Daniele";
        conn.IntegratedSecurity = true;
        try
        {
            SqlConnection connessione = new SqlConnection(conn.ConnectionString);
            SqlCommand reader = new SqlCommand("SELECT * FROM Products", connessione);

            connessione.Open();
            SqlDataReader lettura = reader.ExecuteReader();
            ListBox1.DataSource = lettura;
            ListBox1.DataTextField = "Nome";
            ListBox1.DataValueField = "Cognome";
            ListBox1.DataBind();
            Response.Write("Elementi restituiti: " + ListBox1.Items.Count.ToString());
        }

        catch (HttpException errore)
        {
            Response.Write(errore.ToString());
        }
        
        
    }
}

Ho provato ad inserire, dopo il "catch", un blocco:

Codice:
finally
{
connessione.Close();
connessione.Dispose();
}

ma l'intellisense di VS non mi propone i metodi Close() e Dispose(), mentre facendo una prova, giusto così, all'interno del blocco try, appena scrivo "connessione", nel menù contestuali i metodi in questione ci sono. Dove sbaglio? Che?!?
Registrato
DonZaucker74
Jr. Member
**

Karma: +4/-1
Scollegato Scollegato

Messaggi: 150


Mostra profilo
« Risposta #1 inserita:: Ottobre 02, 2014, 11:38:35 »

Il codice che sta sotto il blocco "try" è un codice che in ogni momento può generare un'eccezione.
Il codice che sta sotto il blocco "finally" è invece un codice che COMUNQUE viene eseguito, sia che il blocco "try" generi un'eccezione, sia che non la generi.

Proprio perchè non si sa se e quando verrà generata un'eccezione le variabili utilizzate nel "finally" devono essere dichiarate fuori dal blocco try/catch/finally.

dZ

Registrato
danyw3b
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 35

pk136zu@hotmail.com
Mostra profilo
« Risposta #2 inserita:: Ottobre 02, 2014, 11:49:45 »

Non ho ben capito a dire il vero.
Esempio:

Codice:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;

public partial class connessione : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnectionStringBuilder conn = new SqlConnectionStringBuilder();
        conn.DataSource = "localhost\\SQLExpress";
        conn.InitialCatalog = "Daniele";
        conn.IntegratedSecurity = true;
        try
        {
            SqlConnection connessione = new SqlConnection(conn.ConnectionString);
            SqlCommand reader = new SqlCommand("SELECT * FROM Products", connessione);
           
            connessione.Open();
            SqlDataReader lettura = reader.ExecuteReader();
            ListBox1.DataSource = lettura;
            ListBox1.DataTextField = "Nome";
            ListBox1.DataValueField = "Cognome";
            ListBox1.DataBind();
            Response.Write("Elementi restituiti: " + ListBox1.Items.Count.ToString());
            connessione.Close();
            connessione.Dispose();
        }

        catch (HttpException errore)
        {
            Response.Write(errore.ToString());
        }
         
       
        finally
        {
            Response.Write("Operazione completata!");
        }
       
       
    }
}
Così il codice va...ma se invece faccio così, anche come dici te, mettendo il Close e il Dispose fuori da Try-Catch-Finally, non funziona:

Codice:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;

public partial class connessione : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnectionStringBuilder conn = new SqlConnectionStringBuilder();
        conn.DataSource = "localhost\\SQLExpress";
        conn.InitialCatalog = "Daniele";
        conn.IntegratedSecurity = true;
        try
        {
            SqlConnection connessione = new SqlConnection(conn.ConnectionString);
            SqlCommand reader = new SqlCommand("SELECT * FROM Products", connessione);
           
            connessione.Open();
            SqlDataReader lettura = reader.ExecuteReader();
            ListBox1.DataSource = lettura;
            ListBox1.DataTextField = "Nome";
            ListBox1.DataValueField = "Cognome";
            ListBox1.DataBind();
            Response.Write("Elementi restituiti: " + ListBox1.Items.Count.ToString());
           
        }

        catch (HttpException errore)
        {
            Response.Write(errore.ToString());
        }
         
       
        finally
        {
            Response.Write("Operazione completata!");
        }

        connessione.Open();
        connessione.Dispose();
       
    }
}
L'intellisense, nel listato soprariportato, non mi fornisce proprio accesso alle proprietà Open() e Close().
Registrato
DonZaucker74
Jr. Member
**

Karma: +4/-1
Scollegato Scollegato

Messaggi: 150


Mostra profilo
« Risposta #3 inserita:: Ottobre 02, 2014, 12:21:33 »

Citazione

le variabili utilizzate nel "finally" devono essere dichiarate fuori dal blocco try/catch/finally.


Questo significa che la variabile "connessione" la devi dichiarare fuori dal try/catch/finally.
All'interno del try la assegni (new SqlConnection(conn.ConnectionString)).
All'intero della catch potresti per esempio settarla a null, cosi nel finally la testi e se è null (=c'è stata un'eccezione) non fai nulla altrimenti fai la Close() e la Dispose().

Codice:

SqlConnection connessione = null;

try
        {
            connessione = new SqlConnection(conn.ConnectionString);
            SqlCommand reader = new SqlCommand("SELECT * FROM Products", connessione);

            connessione.Open();
            SqlDataReader lettura = reader.ExecuteReader();
            ListBox1.DataSource = lettura;
            ListBox1.DataTextField = "Nome";
            ListBox1.DataValueField = "Cognome";
            ListBox1.DataBind();
            Response.Write("Elementi restituiti: " + ListBox1.Items.Count.ToString());
        }

        catch (HttpException errore)
        {
            connessione = null;
            Response.Write(errore.ToString());

        }
finally
{
if (connessione != null){
connessione.Close()
connessione.Dispose()
}
}

dZ
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines