asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 60261
ASPCode.it - Store

  > > Tips

Chiusura automatica della connessione con il DataReader
di Maurizio Ferrera

Data di pubblicazione: 12/11/2003        Voto della community: 5,00 (Votanti: 1)

Una possibilità del DataReader poco documentata è quella di chiudere automaticamente la connessione associata, alla chiusura del DataReader stesso. E' sufficiente eseguire l'ExecuteReader specificando come parametro CommandBehavior.CloseConnection, cioé myDataReader = myCmd.ExecuteReader(CommandBehavior.CloseConnection).

Questa possibilità torna particolarmente utile quando la logica per l'accesso al database è separata rispetto alla procedura principale. Nell'esempio che segue, la pagina .aspx crea una istanza della classe layerDb e ne chiama il metodo leggiOrdini passando come parametro il nome del paese prelevato da un controllo TextBox; il metodo crea una connessione e la apre, quindi restituisce un DataReader con gli ordini della tabella Ordini di Northwind.mdb che hanno come PaeseDestinatario il parametro passato. Essendo specificato il CommandBeahvior.CloseConnection per l'oggetto cmd che crea il DataReader, la connessione aperta dal metodo leggiOrdini verrà chiusa automaticamente non appena la procedura chiamante chiuderà il DataReader restituito.


<%@ Page Language="C#" Debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

    class layerDb
            {
                public OleDbDataReader leggiOrdini (string strPaeseDestinatario)
                {
                    string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";

                    OleDbConnection cnn = new OleDbConnection(strCnn) ;

                    OleDbCommand cmd = new OleDbCommand ("SELECT * from [Ordini] WHERE [PaeseDestinatario] ='" + strPaeseDestinatario +"'" , cnn);

                    cnn.Open();

                    OleDbDataReader myReader;

                    myReader =  cmd.ExecuteReader(CommandBehavior.CloseConnection);

                    return myReader;
                }
            }
    void  Page_Load()
    {

                if (Page.IsPostBack)
                {
                    layerDb MyLayerDb = new layerDb();

                    OleDbDataReader mioReader = MyLayerDb.leggiOrdini (TextBox1.Text);

                    while (mioReader.Read()) {

                        Response.Write ("<br>" + mioReader[0] + "&nbsp;&nbsp;" +  mioReader[3] + "&nbsp;&nbsp;" + mioReader[13]);

                    }
                    mioReader.Close();

                    // a questo punto la connessione associata a mioReader è chiusa

                }
    }

</script>

<html>
<body>
    <form runat="server">
        <p>
            Stato: <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
            <asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
        </p>

    </form>
</body>
</html>

Una caratteristica - che io sappia - non documentata sta nel fatto che eseguendo il DataBinding del DataReader ad un controllo tipo Repeater, DataList o DataGrid, la chiusura del DataReader - e quindi della connessione associata, se abbiamo usato il CommandBehavior.CloseConnection - avviene da sé, cioé anche senza la chiusura esplicita con myDataReader.Close(). A riprova di quanto detto, modifichiamo il codice in maniera che il metodo leggiOrdini restituisca alla procedura chiamante come parametro out, la connessione aperta; nella procedura principale eseguiamo il DataBinding del DataReader ad un DataGrid controllando lo stato della connessione prima e dopo il DataBinding:


<%@ Page Language="C#" Debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
    class layerDb
            {
                public OleDbDataReader leggiOrdini (string strPaeseDestinatario, out OleDbConnection returnCnn)
                {
                    string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";

                    OleDbConnection cnn = new OleDbConnection(strCnn) ;

                    OleDbCommand cmd = new OleDbCommand ("SELECT * from [Ordini] WHERE [PaeseDestinatario] ='" + strPaeseDestinatario +"'" , cnn);

                    cnn.Open();

                    OleDbDataReader myReader;

                    myReader =  cmd.ExecuteReader(CommandBehavior.CloseConnection);

                    returnCnn= cnn;

                    return myReader;
                }
            }

    void  Page_Load()
    {
                if (Page.IsPostBack)
                {

                    layerDb MyLayerDb = new layerDb();

                    OleDbConnection returnCnn;

                    OleDbDataReader mioReader = MyLayerDb.leggiOrdini (TextBox1.Text, out returnCnn);

                    Response.Write(returnCnn.State);
// l'output sarà "Open"


                    DataGrid1.DataSource = mioReader;
                    DataGrid1.DataBind();


                    Response.Write(returnCnn.State);
// l'output sarà "Close"
                }

    }

</script>

<html>
<body>
    <form runat="server">
        <p>
            Stato: <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
            <asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
        </p>

        <p>
            <asp:DataGrid id="DataGrid1" runat="server"></asp:DataGrid>
        </p>
    </form>
</body>
</html>




Utenti connessi: 60261