Comment travailler avec ADO.Net en mode déconnecté

Le cadre d'accès aux données ADO.Net de Microsoft est utilisé depuis plus de deux décennies maintenant. Vous pouvez exploiter ADO.Net pour effectuer des opérations CRUD sur une grande variété de bases de données à partir de l'environnement géré de .Net CLR.

Un fournisseur de données est un composant logiciel qui encapsule les protocoles utilisés pour se connecter et interagir avec la base de données sous-jacente à partir de l'environnement géré. Certains des fournisseurs de données populaires incluent: le fournisseur de données SQL Server, le fournisseur de données Oracle et le fournisseur de données OLEDB. ADO.Net peut fonctionner à la fois en mode connecté et déconnecté.

Un mode de fonctionnement connecté dans ADO.Net est un mode dans lequel la connexion à la base de données sous-jacente est active pendant toute la durée de vie de l'opération. Pendant ce temps, un mode de fonctionnement déconnecté est celui dans lequel ADO.Net récupère les données de la base de données sous-jacente, stocke les données récupérées temporairement dans la mémoire, puis ferme la connexion à la base de données.

Lorsque vous travaillez avec ADO.Net en mode de fonctionnement déconnecté, vous tirez généralement parti de DataAdapter, DataSet, DataTable et DataTableReader. Alors que le DataAdapter agit comme un pont entre l'application et la base de données, un DataSet est une représentation déconnectée en mémoire de la base de données et peut contenir une ou plusieurs instances DataTable. Un DataTableReader est similaire à un DataReader sauf qu'il fonctionne en mode déconnecté.

Cherchons du code

Nous en avons assez des concepts - entrons dans le code. L'extrait de code suivant montre comment vous pouvez récupérer des données à partir d'une base de données en mode déconnecté. Notez que cet exemple se connecte à la base de données AdventureWorks à des fins d'illustration uniquement.

static void Main(string[] args)

        {

            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataSet dataSet = new DataSet();

                    sqlDataAdapter.Fill(dataSet);

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

        }

Dans la liste de codes ci-dessus, une connexion à la base de données est établie à l'aide d'une instance de la classe SqlConnection. Une instance DataAdapter est ensuite créée et utilisée pour remplir une instance DataSet à l'aide de la méthode Fill () de la classe DataAdapter. La connexion à la base de données est fermée automatiquement lorsque le contrôle sort du bloc "using" car la méthode Dispose () est appelée automatiquement sur l'instance SqlConnection. Les données stockées dans l'instance DataSet résident dans la mémoire et ne dépendent pas d'une connexion de base de données active car DataSet fonctionne en mode déconnecté. Une fois les données extraites de la base de données et stockées dans la mémoire d'une instance DataSet, vous pouvez également modifier les données si vous le souhaitez, puis les conserver à nouveau si nécessaire.

DataRow dataRow = dataSet.Tables[0].NewRow(); //Creates a new data row

//You can now spécifie le values for each of the columns of the data row

dataSet.Tables[0].Rows.Add(dataRow); //Add the data row

sqlDataAdapter.Update(dataSet); // Inserts a new record

Notez que vous pouvez utiliser le bloc "using" sur les types qui implémentent l'interface IDisposable. Le bloc "using" entier est enveloppé dans un bloc try-catch pour gérer les exceptions qui peuvent survenir lorsque le programme est en cours d'exécution. Notez que la chaîne de connexion de cet exemple est extraite d'un fichier de configuration. Il est recommandé d'isoler la chaîne de connexion du code de votre application. Vous pouvez également crypter votre chaîne de connexion si nécessaire.

Vous pouvez également remplir un DataTable de la même manière que vous remplissez un DataSet. Voici un exemple qui illustre cela.

string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);                   

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

Un DataTableReader combine le meilleur des deux mondes, c'est-à-dire qu'il est comme un DataReader qui fonctionne en mode déconnecté et il est plus rapide que DataTable et DataReader. Pour créer un DataTableReader, tout ce que vous avez à faire est d'appeler la méthode CreateDataReader () sur l'instance DataTable.

DataTableReader dataTableReader = dataTable.CreateDataReader();

La liste de codes suivante montre comment vous pouvez afficher les noms de tous les départements à l'aide de DataTableReader.

static void Main(string[] args)

        {

            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);

                    DataTableReader dataTableReader = dataTable.CreateDataReader(); 

                    while(dataTableReader.Read())

                    {

                        Console.WriteLine(dataTableReader["Name"].ToString());

                    }      

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

            Console.Read();

        }