asp - asp.net - aspcode.it

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

  > > Tips

Usare le interfacce per l'accesso ai database
di Maurizio Ferrera

Data di pubblicazione: 25/02/2004        Voto della community: 0,00 (Votanti: 0)

Come forse è noto, le varie classi che consentono l'accesso ai database (OleDbDataReader, SqlCommand, etc.) sono l'implementazione di corrispondenti interfacce. Una interfaccia è semplicemente la definizione dei metodi e rispettive signature senza pero' l'implementazione, che si trova invece nelle classi che vogliono derivare da essa. Ad esempio le familiari classi OleDbDataReader del namespace System.Data.OleDb e la classe SqlDataReader del namespace System.Data.SqlClient sono due diverse implementazioni della stessa interfaccia, IDataReader.
Possiamo dunque architettare un'applicazione indipendente dal namespace utilizzato per l'accesso al database, riferendoci ai metodi delle interfacce piuttosto che alle classi degli specifici namespace, demandando questo compito a un componente separato che potrà essere facilmente sostituito con un altro per supportare un database diverso. Vediamo un esempio:

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

    void showResult () {
   
        IDataReader dr = ordini.getList ();
   
        while (dr.Read()) {
            Response.Write ("<br>" + dr[0] + "&nbsp;&nbsp;" + dr[1] + "&nbsp;&nbsp;" + dr[2]);
        }
   
        dr.Close();
    }
   
   
    void  Page_Load() {
   
            showResult();
    }

</script>

Questo file come si vede è indipendente dal namespace specifico per l'accesso al database, essendo System.Data l'unico namespace importato. Abbiamo invece instanziato l'oggetto per accedere ai dati sequenzialmente come IDataReader, con:

IDataReader dr = ordini.getList ();

e utilizzato il suo metodo Read per leggere i dati, come se si trattasse di un OleDbDataReader o SqlDataReader.
Vediamo ora la definizione del metodo ordini.getList() che troviamo in un file separato, referenziato con la direttiva <%@ assembly Src="layerDb.cs" %>

//
// layerDb.cs
//

using System;
using System.Data;
using System.Data.OleDb;


public class ordini  {

    public static OleDbDataReader getList () {

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";

        OleDbConnection cnn = new OleDbConnection(strCnn) ;

        OleDbCommand cmd = new OleDbCommand ("SELECT TOP 30 * from prodotti", cnn);

        cnn.Open();

        OleDbDataReader myReader;

        myReader =  cmd.ExecuteReader(CommandBehavior.CloseConnection);

        return myReader;
    }
}

Il metodo statico getList() in questo caso usa l'oggetto OleDbDataReader per l'accesso ai dati del database formato Access e restituisce appunto un OleDbDataReader al file principale che, come abbiamo visto, lo istanzia più genericamente come IDataReader. Se decidessimo ad un certo punto di supportare SqlServer e usare il namespace System.Data.SqlClient, basterebbe modificare solo il secondo file, il primo essendo indipendente attraverso l'uso dell'oggetto IDataReader.


N.B. Questa tecnica può essere utilizzata per i compiti più comuni di accesso ai database.
In casi più complessi è possibile che eventuali implementazioni di metodi specifici non siano supportati dall'interfaccia corrispondente.




Utenti connessi: 5884