in

DotNetSide

Dot Net South Italy Developers User Group

Tips

Recuperare un datatable da DataTable.Select()

Autore: Francesco Guadagno

Sia con Ado.NET 2.0 che con il suo predecessore 1.1 è disponibile la classe “DataTable” che espone diversi metodi per visualizzare, organizzare e interrogare i dati in maniera disconnessa. Molte volte ne consegue che tale oggetto viene passato alla proprietà “DataSource” di una DataGrid, DataList, Repeater per il popolamento dei dati.

Uno dei metodi più utilizzati è il metodo “Select()” che permette di ottenere un sub-set di dati mediante il passaggio di alcuni parametri tipici di una query SQL come la clausola “where” piuttosto che “order by”, possibilità offerte anche dalla classe DataView mediante l’impostazione di proprietà quali “RowFilter” e “Sort”.

Quando però non si vuole rinunciare alle potenzialità d’uso delle DataTable, può risultare piuttosto scomodo ricevere, come output del metodo “Select()”, un array di DataRow che ci troveremo costretti a dover riconvertire in DataTable.

Il tutto viene risolto con un metodo pubblico di questo tipo:

public static void DataTableSelect(ref DataTable SourceDataTable, string filterExpression, string sort)
{
    if (sort != null)
    {
        DataRow[] drSelect = SourceDataTable.Select(filterExpression, sort);
        SourceDataTable = DataRowToDataTable(drSelect,SourceDataTable.Clone());
    }
    else
    {
        DataRow[] drSelect = SourceDataTable.Select(filterExpression);
        SourceDataTable = DataRowToDataTable(drSelect, SourceDataTable.Clone());
    }
}

Il metodo seguente è del tutto analogo, ma senza il parametro “sort”, richiama il primo.

public static void DataTableSelect(ref DataTable SourceDataTable, string filterExpression)
{
    DataTableSelect(ref SourceDataTable, filterExpression, null);
}

Entrambe i metodi fanno riferimento ad un ulteriore metodo (dichiarabile anche come private) che si occupa della conversione dell’array di DataRow in un DataTable.

public static DataTable DataRowToDataTable(DataRow[] arrDataRow, DataTable dtTarget)
{
//Controllo
if (arrDataRow.Length > 0)
{
    if (arrDataRow[0].ItemArray.Length != dtTarget.Columns.Count)
        return dtTarget;
    }
    DataRow drNew = null;
    foreach (DataRow dr in arrDataRow)
    {
        drNew = dtTarget.NewRow();
        drNew.ItemArray = dr.ItemArray;
        dtTarget.Rows.Add(drNew);
    }
    return dtTarget;
}
UTILIZZO

DataTable dt = [....output Query....]
DataTableSelect(ref dt,"codice = 20");

Il DataTable dt, risulta già filtrato e conserva la struttura.
Only published comments... Jun 01 2006, 09:37 AM by VitoA
Filed under:

Comments

 

Mighell's blog said:

Oggi girovagavo un po’ senza meta tra i settaggi di Community Server (su cui gira .netSide) e sono andato...
June 4, 2006 1:05 PM
 

Mighell's Blog said:

June 4, 2006 1:06 PM
 

Mighell's blog said:


Oggi girovagavo un po’ senza meta tra i settaggi di Community Server (su cui gira .netSide) e sono...
June 4, 2006 1:09 PM
Powered by Community Server (Commercial Edition), by Telligent Systems