mercredi 19 janvier 2011

ADO.NET - Aide mémoire - 2/4 : DataSet

Le présent article fait parti d'une suite logique de 4 articles: "ADO.NET - Aide mémoire - 1/4 : Execution, Parametres, StoredProc, DataReader",  "ADO.NET - Aide mémoire - 2/4 : DataSet", "ADO.NET - Aide mémoire - 2/4 : DataView" et "ADO.NET - Aide mémoire - 4/4 : Tutoriel"

Cet aide mémoire se focalisera plutôt sur l'utilisation générale des DataSets.
On y découvrira:
  • L'utilisation du SqlCommand, SqlDataAdapter et DataSet afin de lire les données (via DataTable et DataRow).
  • Les méthodes de lectures via:
    • DataTable.Rows : collection of DataRow
    • DataTable.Select : Permettant le filtrage et le tri d'un sous ensemble des enregistrements. Aussi une collection de DataRow.
    • DataTable.DefaultView : DataView permettant également le filtrage et le tri d'un sous ensemble. DataView contenant une collection de DataRowView.
  • Mise à jour des données d'une DataTable dans un Dataset (et sauvegarde en DB).
eTutorial.org

    En référence, je mentionnerais également:
    DataViews
    Les DataViews offrent de nombreuses possibilités avancées qui va bien au-delà de ce qui est présenté dans l'exemple de cet article.
    L'article "ADO.NET - Aide mémoire - 3/4 : DataViews" reprend une description et quelques références Microsoft.

    Exemple 
    Voici l'exemple dont seulement les parties les plus pertinentes sont reprises dans l'article (voir fichier source pour la totalité du code).
    Cet exemple utilise Snippet Compiler comme d'habitude.
    Fichier Source: AdoNet_DataSet.cs
    using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;
    public class MyClass
    {
        public static void RunSnippet()
        {
            DropTestDatabase(); // Drop the test database if any exists
            CreateTestDatabase();
            
            DisplaySortedDataset();
            UpdateDataSet();
        }
        
        public static void DisplaySortedDataset () {
            WL( "=== DATASET read/filter/sort operation =================" );
            SqlConnection sqlConn = GetTestConnection();
            sqlConn.Open();
            
            SqlCommand sqlCmd = new SqlCommand( "select * from usr", sqlConn );
            SqlDataAdapter sqlAd = new SqlDataAdapter( sqlCmd );
            DataSet ds = new DataSet();
            sqlAd.Fill( ds, "dataTableName_User" ); // give an explicit name for the sample
            // Display all DataTable.TableName in the DataSet
            foreach( DataTable tbl in ds.Tables )
                WL( String.Format( "  DataSet.Tables[i].TableName="+ tbl.TableName ));
    
            // === DataTable Rows =====================
            // Display the Data
            WL( "Display data (Via Rows)" );
            foreach( DataRow dr in ds.Tables["dataTableName_User"].Rows )
                WL( String.Format( "   User {0} (id:{1})", dr["usrname"].ToString(), dr["uid"].ToString() ));
            
            // === DataTable Select ===================
            // Sort it + redisplay it
            WL( "Display sorted data (via Select)" );
            DataRow[] sorted = ds.Tables["dataTablename_User"].Select("usrname like '%'", "uid desc");
            foreach( DataRow dr in sorted )
                WL( String.Format( "   User {0} (id:{1})", dr["usrname"].ToString(), dr["uid"].ToString() ));
            // SubSelect + sort
            WL( "Display filtered data (via Select)" );
            DataRow[] filtered = ds.Tables["dataTablename_User"].Select("usrname like '%a%'", "usrname asc");
            foreach( DataRow dr in filtered )
                WL( String.Format( "   User {0} (id:{1})", dr["usrname"].ToString(), dr["uid"].ToString() ));
    
            // === DataView ===========================
            // Sorted and filtered with DataView
            //   DataView may be very useful to work with visual componant
            //   More information on DataViews on Microsoft site @
            //     http://msdn.microsoft.com/en-us/library/fdcwwhez.aspx
            //
            WL( "Display filtered data (via DataView)" );
            DataView dv = ds.Tables["dataTableName_User"].DefaultView;
            dv.RowFilter = "usrname like '%a%'";
            dv.Sort = "uid desc";
            // In a DataView, the Rows are available via DataRowView        
            foreach( DataRowView drv in dv )
                WL( String.Format( "   User {0} (id:{1})", drv["usrname"].ToString(), drv["uid"].ToString() ));
            
            sqlConn.Close();
        }
        
        public static void UpdateDataSet () {
            WL( "=== UPDATE operation ============================" );
            SqlConnection sqlConn = GetTestConnection();
            sqlConn.Open();
            // Read the data
            SqlDataAdapter ad = new SqlDataAdapter( "Select * from USR order by usrName desc", sqlConn );
            // Create a CommandBuilder, this will automatically generate the appropriate commands
            // and set the various properties of the SqlAdapter.
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder( ad );
            // Create and fill dataset
            DataSet ds = new DataSet();
            ad.Fill( ds, "USR" );
    
            // Display the Data
            WL( "Display data BEFORE change" );
            foreach( DataRow dr in ds.Tables["USR"].Rows )
                WL( String.Format( "   User {0} (id:{1})", dr["usrname"].ToString(), dr["uid"].ToString() ));
    
            // Update Data
            DataRow[] filtered = ds.Tables["USR"].Select( "usrname like 'anatole'", "uid" );
            if( filtered.Length > 0 ) {
                filtered[0]["usrname"] = "John Doe";
            }
            
            // Add a new row 
            //   Removal is done with DataTable.Rows.RemoveAt(RowIndex) or DataTable.Rows.Remove( DataRowObject )
            DataRow added = ds.Tables["USR"].Rows.Add();
            added["usrname"] = "Florentin Célestin";
            added["uid"] = 120;
            
            // Save the DataSet
            ad.Update(ds, "USR");
            
            // ReRead the DataSet and Display result
            ds.Clear();
            ad.Fill( ds, "USR" );
            // Display the Data
            WL( "Display data AFTER change" );
            foreach( DataRow dr in ds.Tables["USR"].Rows )
                WL( String.Format( "   User {0} (id:{1})", dr["usrname"].ToString(), dr["uid"].ToString() ));
            
            sqlConn.Close();
        }
        
        #region Sample Database helper    // Connect and create the Test Database
        // See the source file for the Full code. 
        #endregion
        
        #region Helper methods    // ...    
        #endregion
    }
    

    Aucun commentaire: