asp - asp.net - aspcode.it

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

  > > Articoli

Funzioni di ricerca, filtro e ordinamento in ADO.NET (2/2)

Data di pubblicazione: 21/04/2004        Voto della community: 3,58 (Votanti: 4)


Nella prima parte dell'articolo abbiamo visto le possibilità di ricerca, filtro e ordinamento dell'oggetto DataTable. Qui vediamo le medesime possibilità dell'oggetto DataView, mettendone in evidenza le differenze rispetto all'oggetto DataTable.

Filtro e ordinamento dei dati tramite il DataView

Un oggetto DataView fonisce una vista dinamica di una DataTable secondo certi criteri di filtro e ordinamento. In quest'ottica è simile al metodo Select di una DataTable che restituisce un array di DataRow come visto nell'articolo precedente; sia il DataView sia il DataRow array riflettono i cambiamenti che si verificano nei valori corrispondenti della tabella sottostante ma, nel caso del DataView, l'ordinamento e l'appartenenza di un record all'oggetto DataView sono dinamici, ossia (ad esempio) un' eventuale cancellazione di un record nella tabella originaria si riflette anche nelle righe del DataView, laddove gli elementi dell'array di DataRow sono in questo senso statici (nel caso appena visto della cancellazione di un record nella DataTable originaria, riferendosi ad un elemento dell'array di DataRow corrispondente al record eliminato si va incontro ad una eccezione di riga eliminata).

Una seconda differenza del DataView rispetto all'array di DataRow restuito dal metodo Select di DataTable sta nel fatto che il secondo non può essere utilizzato per il databinding ad un controllo (un DataGrid ad esempio), mentre ciò è possibile con il DataView.
L'esempio seguente collega un DataGrid ad un DataView che filtra la tabella Prodotti secondo l'IDCategoria, ordinandola secondo il NomeProdotto e con il DataViewRowState a CurrentRows. Il codice dovrebbe essere autoesplicativo.

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

    void Page_Load () {

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
        OleDbConnection cnn = new OleDbConnection(strCnn) ;
        cnn.Open();
        DataSet ds = new DataSet();
        OleDbDataAdapter da = new OleDbDataAdapter();
        OleDbCommand cmd = new OleDbCommand("SELECT * from prodotti", cnn);
        da.SelectCommand = cmd;
        da.Fill(ds, "articoli");
        cnn.Close();

        DataView dv = new DataView(ds.Tables["articoli"], "IDCategoria = 2", "NomeProdotto DESC", DataViewRowState.CurrentRows);

        DataGrid1.DataSource = dv;
        DataGrid1.DataBind();
    }

</script>

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



Funzioni di ricerca tramite il metodo Find o FindRows di DataView

Per eseguire ricerche più veloci, è indicato il metodo Find o FindRows. Find o FindRows ricercano la o le righe all'interno di un DataView in base al valore di una o piu chiavi di ordinamento (sort keys).

Se volessimo ricercare ad esempio l'indice della riga del DataView con un determinato valore del campo NomeProdotto, useremmo come criterio di ordinamento il campo NomeProdotto (discendente o ascendente) e chiameremmo poi il metodo Find specificando il valore del campo da ricercare, che resituirà un intero rappresentante l'indice della prima occorrenza di DataRowView che soddisfa tale criterio di ricerca.
Nell'esempio seguente, cerchiamo l'indice della prima occorrenza di "Northwoods Cranberry Sauce" del campo NomeProdotto del DataView ordinato appunto secondo il campo NomeProdotto:

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

    void Page_Load () {

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
        OleDbConnection cnn = new OleDbConnection(strCnn) ;
        cnn.Open();
        DataSet ds = new DataSet();
        OleDbDataAdapter da = new OleDbDataAdapter();
        OleDbCommand cmd = new OleDbCommand("SELECT * from prodotti", cnn);
        da.SelectCommand = cmd;
        da.Fill(ds, "articoli");
        cnn.Close();

        DataView dv = new DataView(ds.Tables["articoli"], "", "NomeProdotto DESC", DataViewRowState.CurrentRows);

        int rowIndex = dv.Find("Northwoods Cranberry Sauce");

        Response.Write (rowIndex);

        DataGrid1.DataSource = dv;
        DataGrid1.DataBind();
    }

</script>

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


Se non viene trovata alcuna occorrenza è restuito -1. Se invece volessimo cercare una riga in base al valore di più colonne, ad esempio 2 colonne, ordineremmo il DataView secondo le 2 colonne e chiameremmo il metodo Find passando i due valori da ricercare sotto forma di array di object.
Nell'esempio seguente cerchiamo la prima occorrenza di DataRowView con IDFornitore=2 e IDCategoria=2:

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

    void Page_Load () {

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
        OleDbConnection cnn = new OleDbConnection(strCnn) ;
        cnn.Open();
        DataSet ds = new DataSet();
        OleDbDataAdapter da = new OleDbDataAdapter();
        OleDbCommand cmd = new OleDbCommand("SELECT * from prodotti", cnn);
        da.SelectCommand = cmd;
        da.Fill(ds, "articoli");
        cnn.Close();

        DataView dv = new DataView(ds.Tables["articoli"], "", "IDCategoria, IDFornitore", DataViewRowState.CurrentRows);

        int rowIndex = dv.Find (new object[] {"2","2"} );

        Response.Write (rowIndex);

        DataGrid1.DataSource = dv;
        DataGrid1.DataBind();
    }
</script>

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


Se i valori restituiti fossero più di uno, potremmo recuperarli attraverso il metodo FindRows che restituisce un array di DataRowView. Nell'esempio precedente, la riga che usa il metodo Find diventerebbe con il metodo FindRows:

DataRowView[] foundRows = dv.FindRows (new object[] {"2","2"} );







Utenti connessi: 12651