Vous êtes sur la page 1sur 69

VB NET ACCES AUX DONNEES

Raliser Par : SGHIOUAR ABDELFATAH

VB NET

Accs aux donnes

Chapitre 1 : INTRODUCTION
Mode connect et mode dconnect
Le traitement des donnes repose traditionnellement sur un modle deux couches utilisant une connexion. Le traitement des donnes utilisant de plus en plus des architectures multicouches, les programmeurs s'orientent vers une approche dconnecte de faon proposer une meilleure volutivit pour leurs applications.

XML et ADO.NET
ADO.NET tire parti de la puissance de XML pour fournir un accs dconnect aux donnes. ADO.NET a t conu avec les classes XML du .NET Framework ; les deux composants appartiennent une mme architecture. ADO.NET et les classes XML du .NET Framework convergent dans l'objet DataSet. Le DataSet peut tre rempli de donnes provenant d'une source XML, qu'il s'agisse d'un fichier ou d'un flux XML. Le DataSet peut tre crit en XML conforme au W3C (World Wide Web Consortium), y compris son schma, en tant que schma en langage XSD (XML Schema Definition), quelle que soit la source des donnes contenues dans le DataSet. Le format de srialisation natif du DataSet tant XML, il constitue un excellent support pour le dplacement de donnes entre couches, faisant ainsi du DataSet le meilleur choix pour proposer un accs distant aux donnes et au contexte du schma vers et partir d'un service Web XML.

Composants de ADO.NET
Les composants de ADO.NET ont t conus de faon distinguer l'accs aux donnes de la manipulation de donnes. Cette distinction est rendue possible par deux composants centraux de ADO.NET : le DataSet et le fournisseur de donnes .NET Framework, qui est un ensemble de composants comprenant les objets Connection, Command, DataReader et DataAdapter. Le DataSet ADO.NET est le composant principal de l'architecture dconnecte de ADO.NET. Le DataSet est explicitement conu pour permettre un accs aux donnes indpendant de toute source de donnes. Il peut donc tre utilis avec plusieurs sources de donnes diffrentes, utilis avec des donnes XML ou utilis pour grer des donnes locales de l'application. Le DataSet contient une collection d'un ou de plusieurs

VB NET

Accs aux donnes

objets DataTable constitus de lignes et de colonnes de donnes, ainsi que des informations concernant les contraintes de cl primaire, de cl trangre et des informations relationnelles sur les donnes contenues dans les objets DataTable. L'autre lment principal de l'architecture ADO.NET est le fournisseur de donnes .NET Framework dont les composants sont explicitement conus pour la manipulation des donnes et un accs aux donnes rapide, avant uniquement (forward only) et en lecture seule. L'objet Connection assure la connectivit avec une source de donnes. L'objet Command permet l'accs aux commandes de base de donnes pour retourner des donnes, modifier des donnes, excuter des procdures stockes et envoyer ou extraire des informations sur les paramtres. Le DataReader fournit un flux trs performant de donnes en provenance de la source de donnes. Enfin, le DataAdapter tablit une passerelle entre l'objet DataSet et la source de donnes. Le DataAdapter utilise les objets Command pour excuter des commandes SQL au niveau de la source de donnes afin d'une part d'approvisionner le DataSet en donnes, et d'autre part de rpercuter dans la source de donnes les modifications apportes aux donnes contenues dans le DataSet. Vous pouvez crire des fournisseurs de donnes .NET Framework pour n'importe quelle source de donnes. Le .NET Framework est livr avec deux fournisseurs de donnes .NET Framework : le fournisseur de donnes .NET Framework pour SQL Server et le fournisseur de donnes .NET Framework pour OLE DB. Le schma suivant reprsente les composants de l'architecture ADO.NET.
Architecture ADO.NET

Le code suivant montre comment inclure l'espace de noms System.Data dans vos applications pour que vous puissiez utiliser ADO.NET.

VB NET

Accs aux donnes

Imports System.Data Les classes ADO.NET se trouvent dans System.Data.dll et sont intgres aux classes XML de System.Xml.dll. Lors de la compilation du code qui utilise l'espace de noms System.Data, il convient de rfrencer System.Data.dll ainsi que System.Xml.dll.

Connexion SQL Server l'aide de ADO.NET


L'exemple de code suivant illustre la cration et l'ouverture d'une connexion une base de donnes SQL Server (version 7.0 ou ultrieure). Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") nwindConn.Open() Fermeture de la connexion Il est recommand de toujours fermer l'objet Connection lorsque vous avez fini de l'utiliser. Pour cela, utilisez les mthodes Close ou Dispose de l'objet Connection.

Connexion une source de donnes OLE DB l'aide de ADO.NET


L'exemple de code suivant illustre la cration et l'ouverture d'une connexion une source de donnes OLE DB. Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") nwindConn.Open()

Connexion une source de donnes ODBC l'aide de ADO.NET


L'exemple de code suivant illustre la cration et l'ouverture d'une connexion une source de donnes ODBC. Dim nwindConn As OdbcConnection = New OdbcConnection("Driver={SQL Server};Server=localhost; Trusted_Connection=yes;Database=northwind") nwindConn.Open()

VB NET

Accs aux donnes

Connexion une source de donnes Oracle l'aide de ADO.NET


L'exemple de code suivant illustre la cration et l'ouverture d'une connexion une source de donnes Oracle. Dim nwindConn As OracleConnection = New OracleConnection("Data Source=MyOracleServer;Integrated Security=yes;") nwindConn.Open()

Excution d'une commande


Aprs avoir tabli une connexion une source de donnes, vous pouvez excuter des commandes et retourner les rsultats de la source l'aide d'un objet Command. SqlClient Dim catCMD As SqlCommand = New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn) OleDb Dim catCMD As OleDbCommand = New OleDbCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn)

Obtention d'une valeur unique partir d'une base de donnes


Vous aurez peut-tre besoin de retourner des informations de base de donnes qui sont simplement une valeur unique plutt qu'une table ou un flux de donnes. Par exemple, vous souhaitez ventuellement retourner le rsultat d'une fonction d'agrgation telle que Count(*), Sum(Price) ou Avg(Quantity). L'objet Command fournit la fonctionnalit permettant de retourner des valeurs uniques l'aide de la mthode ExecuteScalar. La mthode ExecuteScalar retourne comme valeur scalaire la valeur de la premire colonne de la premire ligne du jeu de rsultats. L'exemple de code suivant retourne le nombre d'enregistrements dans une table utilisant la fonction d'agrgation Count. Dim ordersCMD As SqlCommand = New SqlCommand("SELECT Count(*) FROM Orders", nwindConn) Dim count As Int32 = CInt(ordersCMD.ExecuteScalar())

Excution d'oprations de catalogue


Pour excuter une commande permettant de modifier une base de donnes ou un catalogue, comme l'instruction CREATE TABLE ou CREATE PROCEDURE, crez Command l'aide de la ou des instructions Transact-

VB NET

Accs aux donnes

SQL appropries et de Connection. Excutez la commande avec la mthode ExecuteNonQuery de l'objet Command. L'exemple de code suivant cre une procdure stocke dans une base de donnes Microsoft SQL Server.
Dim createStr As String = "CREATE PROCEDURE InsertCategory " & _ " @CategoryName nchar(15), " & _ " @Identity int OUT " & _ "AS " & _ "INSERT INTO Categories (CategoryName) " & _ "VALUES (@CategoryName) " & _ "SET @Identity = @@Identity " & _ "RETURN @@ROWCOUNT" Dim createCMD As SqlCommand = New SqlCommand(createStr, nwindConn) createCMD.ExecuteNonQuery()

Modification de donnes dans une base de donnes


Les instructions SQL qui modifient les donnes (comme INSERT, UPDATE ou DELETE) ne retournent pas de lignes. De mme, de nombreuses procdures stockes effectuent une action mais ne retournent pas de lignes. Pour excuter des commandes qui ne retournent pas de lignes, crez un objet Command avec la commande SQL approprie et Connection (et les Parameters requis) puis utilisez la mthode ExecuteNonQuery de l'objet Command. La mthode ExecuteNonQuery retourne un entier qui reprsente le nombre de lignes affectes par l'instruction ou la procdure stocke excute. Si plusieurs instructions sont excutes, la valeur retourne est la somme des enregistrements affects par toutes ces instructions. L'exemple de code suivant excute une instruction INSERT pour insrer un enregistrement dans une base de donnes l'aide de ExecuteNonQuery.
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") nwindConn.Open() Dim insertStr As String = "INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')" Dim insertCMD As SqlCommand = New SqlCommand(insertStr, nwindConn) Dim recordsAffected As Int32 = insertCMD.ExecuteNonQuery()

L'exemple de code suivant excute la procdure stocke cre par l'exemple de code dans Excution d'oprations de catalogue. Aucune ligne n'est retourne par la procdure stocke, la mthode ExecuteNonQuery est donc utilise mais la procdure stocke reoit un paramtre d'entre et retourne un paramtre de sortie et une valeur de retour. Pour l'objet OleDbCommand, le paramtre ReturnValue doit tre d'abord ajout la collection Parameters.
Dim insertCatCMD As SqlCommand = New SqlCommand("InsertCategory" , nwindConn)

VB NET

Accs aux donnes

insertCatCMD.CommandType = CommandType.StoredProcedure Dim workParm As SqlParameter workParm = insertCatCMD.Parameters.Add("@RowCount", SqlDbType.Int) workParm.Direction = ParameterDirection.ReturnValue workParm = insertCatCMD.Parameters.Add("@CategoryName", SqlDbType.NChar, 15) workParm = insertCatCMD.Parameters.Add("@Identity", SqlDbType.Int) workParm.Direction = ParameterDirection.Output insertCatCMD.Parameters("@CategoryName").Value = "New Category" insertCatCMD.ExecuteNonQuery() Dim catID As Int32 = CInt(insertCatCMD.Parameters("@Identity").Value) Dim rowCount As Int32 = CInt(insertCatCMD.Parameters("@RowCount").Value)

VB NET

Accs aux donnes

Chapitre 2 : UTILISATION DE DATAREADER


Vous pouvez utiliser le DataReader ADO.NET pour extraire d'une base de donnes un flux de donnes en lecture seule et avant uniquement. Les rsultats sont retourns pendant que la requte s'excute et stocks dans la mmoire tampon de rseau sur le client jusqu' ce que vous les demandiez au moyen de la mthode Read de DataReader. L'utilisation de DataReader peut augmenter les performances de l'application d'abord en extrayant les donnes ds qu'elles sont disponibles, plutt que d'attendre que tous les rsultats de la requte aient t retourns, et ensuite en ne stockant (par dfaut) qu'une seule ligne la fois dans la mmoire, ce qui rduit la charge du systme. Aprs avoir cr une instance de l'objet Command, vous crez un DataReader en appelant Command.ExecuteReader pour extraire les lignes d'une source de donnes, comme le montre l'exemple suivant. Dim myReader As SqlDataReader = myCommand.ExecuteReader() Vous utilisez la mthode Read de l'objet DataReader pour obtenir une ligne des rsultats de la requte. Vous pouvez accder chaque colonne de la ligne retourne en passant le nom ou la rfrence ordinale de la colonne au DataReader. Cependant, pour une meilleure performance, le DataReader fournit une srie de mthodes qui vous permettent d'accder aux valeurs de colonnes dans leurs types de donnes natifs (GetDateTime, GetDouble, GetGuid, GetInt32, etc.). Remarque La version 1.1 du .NET Framework inclut une proprit supplmentaire pour le DataReader, HasRows, laquelle vous permet de dterminer si le DataReader a retourn des rsultats avant de le lire. L'exemple de code suivant itre dans un objet DataReader et retourne une colonne partir de chaque ligne.
Module Module1 Sub Main() Dim cn As New OleDb.OleDbConnection() cn.ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\bd.mdb;" cn.Open() Dim CMD As New OleDb.OleDbCommand("select * from Article", cn) Dim RDR As OleDb.OleDbDataReader = CMD.ExecuteReader() While (RDR.Read()) Console.WriteLine(RDR.GetString(1)) End While Console.ReadLine() RDR.Close() cn.Close() End Sub End Module

VB NET

Accs aux donnes

Le DataReader fournit un flux de donnes non mis en tampon qui permet la logique procdurale de traiter efficacement les rsultats provenant d'une source de donnes de faon squentielle. Le DataReader se rvle tre un bon choix lors de l'extraction de grandes quantits de donnes car celles-ci ne sont pas mises en cache dans la mmoire. Fermeture du DataReader Vous devez toujours appeler la mthode Close lorsque vous avez fini d'utiliser l'objet DataReader. Si Command contient des paramtres de sortie ou des valeurs de retour, ils ne seront pas disponibles avant la fermeture du DataReader. Notez que pendant l'ouverture d'un DataReader, Connection est utilis en mode exclusif par ce DataReader. Vous ne pourrez pas excuter les commandes pour Connection, y compris la cration d'un autre DataReader, jusqu' la fermeture du DataReader d'origine.

VB NET

Accs aux donnes

Chapitre 3 : UTILISATION DES PROCEDURES STOCKEES AVEC UNE COMMANDE


Excution dune procdure stocke
Les procdures stockes offrent de nombreux avantages dans les applications pilotes par des donnes. En utilisant les procdures stockes, les oprations de base de donnes peuvent tre encapsules dans une commande unique, optimises pour une meilleure performance et amliores grce une scurit supplmentaire. Tandis qu'une procdure stocke peut tre appele en passant simplement son nom suivi des arguments de paramtre comme instruction SQL, l'utilisation de la collection Parameters de l'objet Command ADO.NET vous permet de dfinir plus explicitement les paramtres de procdure stocke et d'accder aux paramtres de sortie et aux valeurs de retour. Pour appeler une procdure stocke, affectez StoredProcedure au CommandType de l'objet Command. Une fois StoredProcedure affect CommandType, vous pouvez utiliser la collection Parameters pour dfinir les paramtres, comme dans l'exemple suivant. Ce code appelle la procdure stocke VentesParCatgorie qui accepte un paramtre en entre.
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") Dim salesCMD As SqlCommand = New SqlCommand("VentesParCatgorie", nwindConn) salesCMD.CommandType = CommandType.StoredProcedure Dim myParm As SqlParameter = salesCMD.Parameters.Add("@Categorie", SqlDbType.NVarChar, 15) myParm.Value = "Condiments" nwindConn.Open() Dim myReader As SqlDataReader = salesCMD.ExecuteReader() Console.WriteLine(myReader.GetName(0), myReader.GetName(1)) Do While myReader.Read() Console.WriteLine(myReader.GetString(0), myReader.GetDecimal(1)) Loop myReader.Close() nwindConn.Close()

10

VB NET

Accs aux donnes

Utilisation des paramtres


Un objet Parameter peut tre cr l'aide du constructeur Parameter ou en appelant la mthode Add de la collection Parameters de Command. Parameters.Add prendra comme entre les arguments de constructeur ou un objet Parameter existant. Lorsque vous affectez une rfrence null au Value d'un Parameter, utilisez DBNull.Value. Pour les paramtres autres que Input, vous devez dfinir la proprit ParameterDirection pour spcifier si le type de paramtre est InputOutput, Output ou ReturnValue. L'exemple suivant illustre la diffrence entre la cration des paramtres Input, Output et ReturnValue.
Dim sampleCMD As SqlCommand = New SqlCommand("SampleProc", nwindConn) sampleCMD.CommandType = CommandType.StoredProcedure Dim sampParm As SqlParameter = sampleCMD.Parameters.Add("RETURN_VALUE", SqlDbType.Int) sampParm.Direction = ParameterDirection.ReturnValue sampParm = sampleCMD.Parameters.Add("@InputParm", SqlDbType.NVarChar, 12) sampParm.Value = "Sample Value" sampParm = sampleCMD.Parameters.Add("@OutputParm", SqlDbType.NVarChar, 28) sampParm.Direction = ParameterDirection.Output nwindConn.Open() Dim sampReader As SqlDataReader = sampleCMD.ExecuteReader() Console.WriteLine(sampReader.GetName(0), sampReader.GetName(1)) Do While sampReader.Read() Console.WriteLine(sampReader.GetInt32(0), sampReader.GetString(1)) Loop sampReader.Close() nwindConn.Close() Console.WriteLine(" @OutputParm: ", sampleCMD.Parameters("@OutputParm").Value) Console.WriteLine("RETURN_VALUE: ", sampleCMD.Parameters("RETURN_VALUE").Value)

Utilisation des paramtres avec SqlCommand


Lorsque des paramtres sont utiliss avec SqlCommand, les noms des paramtres ajouts SqlParameterCollection doivent correspondre ceux des marqueurs de paramtre de votre procdure stocke. Le fournisseur de donnes .NET Framework pour SQL Server traite les paramtres de la procdure stocke comme des paramtres nomms et recherche les marqueurs de paramtre correspondants. Le fournisseur de donnes .NET Framework pour SQL Server ne prend pas en charge l'espace rserv de point d'interrogation (?) pour le passage des paramtres une instruction SQL ou une procdure stocke. Dans ce cas, vous devez utiliser des paramtres nomms, comme dans l'exemple suivant. SELECT * FROM Customers WHERE CustomerID = @CustomerID

11

VB NET

Accs aux donnes

Utilisation des paramtres avec OleDbCommand ou OdbcCommand


Lorsque des paramtres sont utiliss avec OleDbCommand ou OdbcCommand, l'ordre des paramtres ajouts Parameters doit correspondre celui des paramtres dfinis dans votre procdure stocke. Les fournisseurs de donnes .NET Framework pour OLE DB et ODBC traitent les paramtres d'une procdure stocke comme des espaces rservs et applique des valeurs de paramtre par ordre. En outre, les paramtres des valeurs de retour doivent tre les premiers ajouts la collection Parameters. Les fournisseurs de donnes .NET Framework pour OLE DB et ODBC ne prennent pas en charge les paramtres nomms pour le passage des paramtres une instruction SQL ou une procdure stocke. Dans ce cas, vous devez utiliser l'espace rserv de point d'interrogation (?), comme dans l'exemple suivant. SELECT * FROM Customers WHERE CustomerID = ? En consquence, l'ordre dans lequel les objets Parameter sont ajouts la collection Parameters doit directement correspondre la position de l'espace rserv de point d'interrogation pour le paramtre.

12

VB NET

Accs aux donnes

Chapitre 4 : REMPLISSAGE D'UN DATASET A PARTIR D'UN DATAADAPTER


Le DataSet
Le DataSet ADO.NET est une reprsentation de donnes rsident en mmoire qui propose un modle de programmation relationnel cohrent indpendant de la source de donnes. Le DataSet reprsente un jeu de donnes complet, comprenant des tables, des contraintes et des relations entre les tables. tant donn que le DataSet est indpendant de la source de donnes, il peut inclure des donnes locales par rapport l'application ainsi que des donnes provenant de plusieurs sources. L'interaction avec les sources de donnes existantes est contrle par le DataAdapter.

Le DataAdapter
Chaque fournisseur de donnes .NET Framework fourni avec le .NET Framework dispose d'un objet DataAdapter : le fournisseur de donnes .NET Framework pour OLE DB inclut un objet OleDbDataAdapter, le fournisseur de donnes .NET Framework pour SQL Server inclut un objet SqlDataAdapter et le fournisseur de donnes .NET Framework pour ODBC inclut un objet OdbcDataAdapter. Un DataAdapter est utilis pour extraire les donnes d'une source de donnes et remplir les tables dans un DataSet. Le DataAdapter rpercute aussi les modifications apportes au DataSet dans la source de donnes. Le DataAdapter utilise l'objet Connection du fournisseur de donnes .NET Framework pour se connecter une source de donnes et les objets Command pour extraire les donnes de la source et y rpercuter les modifications.

Les objets Command


La proprit SelectCommand du DataAdapter est un objet Command qui extrait les donnes de la source de donnes. Les proprits InsertCommand, UpdateCommand et DeleteCommand du DataAdapter sont des objets Command qui grent les mises jour dans la source de donnes conformment aux modifications faites dans le DataSet. La mthode Fill du DataAdapter est utilise pour remplir un DataSet avec les rsultats de SelectCommand du DataAdapter. Fill prend comme arguments un DataSet remplir et un objet DataTable ou le nom du DataTable remplir avec les lignes retournes par SelectCommand.

13

VB NET

Accs aux donnes

L'exemple de code suivant cre une instance d'un DataAdapter qui utilise un Connection la base de donnes Northwind Microsoft SQL Server et remplit un DataTable dans un DataSet avec la liste des clients. L'instruction SQL et les arguments Connection passs au constructeur DataAdapter sont utiliss pour crer la proprit SelectCommand du DataAdapter.
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") Dim selectCMD As SqlCommand = New SqlCommand("SELECT CustomerID, CompanyName FROM Customers", nwindConn) selectCMD.CommandTimeout = 30 Dim custDA As SqlDataAdapter = New SqlDataAdapter custDA.SelectCommand = selectCMD nwindConn.Open() Dim custDS As DataSet = New DataSet custDA.Fill(custDS, "Customers") nwindConn.Close()

Notez que le code n'ouvre pas et ne ferme pas la Connection de manire explicite. La mthode Fill ouvre implicitement la Connection que le DataAdapter utilise si la connexion n'est pas dj ouverte. Si Fill a ouvert la connexion, il la fermera aussi lorsque Fill est termin. Ceci peut simplifier votre code lorsque vous ne traitez qu'une seule opration telle que Fill ou Update. Cependant, si vous effectuez plusieurs oprations qui ncessitent une connexion ouverte, vous pouvez amliorer la performance de votre application en appelant de manire explicite la mthode Open de Connection, en effectuant les oprations sur la source de donnes puis en appelant la mthode Close de Connection. Vous devez chercher rduire le temps d'ouverture des connexions la source de donnes afin de librer la ressource utilise par les autres applications clientes.

14

VB NET

Accs aux donnes

Chapitre 5 : MISE A JOUR DE LA BASE DE DONNEES AVEC DATAADAPTER ET DATASET


La mthode Update
La mthode Update du DataAdapter est appele pour rpercuter les modifications provenant d'un DataSet dans la source de donnes. Lorsque vous appelez la mthode Update, le DataAdapter analyse les modifications apportes et excute la commande approprie (INSERT, UPDATE ou DELETE). Lorsque le DataAdapter trouve une modification dans un DataRow, il utilise InsertCommand, UpdateCommand ou DeleteCommand pour traiter la modification. Pour grer les exceptions qui peuvent se produire pendant un Update, utilisez l'vnement RowUpdated pour rpondre aux erreurs de mise jour des lignes. Vous pouvez aussi affecter true DataAdapter.ContinueUpdateOnError avant d'appeler Update et rpondre aux informations d'erreur stockes dans la proprit RowError d'une ligne particulire lorsque Update est termin. Les exemples suivants illustrent l'excution des mises jour des lignes modifies en dfinissant de manire explicite le UpdateCommand du DataAdapter. Notez que le paramtre spcifi dans la clause WHERE de l'instruction UPDATE est dfini pour utiliser la valeur Original de SourceColumn. Ceci est important, car la valeur Current peut avoir t modifie et ne pas correspondre la valeur dans la source de donnes. La valeur Original est la valeur qui a t utilise pour remplir le DataTable partir de la source de donnes.
Dim catDA As SqlDataAdapter = New SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn) catDA.UpdateCommand = New SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " & _ "WHERE CategoryID = @CategoryID", nwindConn) catDA.UpdateCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15, "CategoryName") Dim workParm As SqlParameter = catDA.UpdateCommand.Parameters.Add("@CategoryID", SqlDbType.Int) workParm.SourceColumn = "CategoryID" workParm.SourceVersion = DataRowVersion.Original Dim catDS As DataSet = New DataSet catDA.Fill(catDS, "Categories") Dim cRow As DataRow = catDS.Tables("Categories").Rows(0) cRow("CategoryName") = "New Category" catDA.Update(catDS)

15

VB NET

Accs aux donnes

Ordre des insertions, mises jour et suppressions


Dans de nombreuses circonstances, l'ordre dans lequel les modifications faites dans le DataSet sont transmises la source de donnes est important. Par exemple, si une valeur de cl primaire d'une ligne existante est mise jour et qu'une nouvelle ligne est ajoute avec la nouvelle valeur de cl primaire, il est important de traiter la mise jour avant l'insertion. Vous pouvez utiliser la mthode Select du DataTable pour retourner un tableau DataRow qui fait uniquement rfrence des lignes avec un RowState particulier. Vous pouvez alors passer le tableau DataRow retourn la mthode Update du DataAdapter pour traiter les lignes modifies. En spcifiant un sous-ensemble des lignes mettre jour, vous pouvez contrler l'ordre dans lequel les insertions, mises jour et suppressions sont traites. Le code suivant garantit, par exemple, que seront d'abord traites les lignes supprimes de la table puis les lignes mises jour et enfin les lignes insres.
Dim updTable As DataTable = custDS.Tables("Customers") ' First process deletes. custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.Deleted)) ' Next process updates. custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)) ' Finally, process inserts. custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.Added))

16

VB NET

Accs aux donnes

Chapitre 6 : LIAISON DES DONNEES AVEC WINDOWS FORMS


Cration d'un formulaire Windows simple dpendant
L'utilisation la plus simple de la liaison de donnes dans l'environnement .NET sert afficher le contenu d'une table dans une grille. Pour l'exemple ci-dessous, suivez les tapes ci-aprs : 1. Crez un formulaire Windows. 2. Crer et configurer le groupe de donnes auquel vous voulez lier le formulaire. 3. Ajoutez un contrle de grille de donnes au formulaire et liez-le aux donnes.

Cration de l'exemple de formulaire


Vous trouverez ci-dessous les tapes dtailles de la cration d'un exemple de formulaire. 1. Cliquez sur Fichier, Nouveau, puis Projet. La bote de dialogue Nouveau projet s'affiche.

17

VB NET

Accs aux donnes

2. Slectionnez le Type de projet dans l'arborescence situe gauche de la bote de dialogue. Dans cet exemple, slectionnez Projets Visual Basic. 3. Slectionnez Application Windows dans la liste des modles situe droite de la bote de dialogue. 4. Indiquez le nom et l'emplacement du projet que vous voulez crer. Cliquez sur OK pour crer le projet. 5. Appuyez sur F4 pour afficher les proprits du formulaire. Changez la proprit Name du formulaire pour frmClients. 6. Changez la proprit Text pour Informations Clients.

Cration dune nouvelle connexion


Dans lexplorateur de serveurs, cliquez avec le bouton droit de la souris sur Connexions de donnes , slectionnez ensuite loption ajouter une nouvelle connexion

1. la boite de dialogue Proprits des liaisons de donnes s'affiche.

18

VB NET

Accs aux donnes

2. Changez le nom du serveur pour qu'il pointe vers celui de votre serveur SQL. 3. Changez le nom et le mot de passe de l'utilisateur ncessaire pour se connecter ce serveur SQL. 4. Slectionnez la base de donnes Northwind qui sera utilise dans l'exemple.

Cration dun adaptateur de donnes


1. Dans la bote outils, dans l'onglet Donnes, slectionnez un SQLDataAdapter. Faites-le glisser et dposez-le sur le formulaire.

19

VB NET

Accs aux donnes

2. L'Assistant Configuration d'adaptateur de donnes s'affiche. Cliquez sur Suivant. 3. L'assistant vous permet de dsigner le type de requte. Slectionnez Utiliser des instructions SQL et cliquez sur Suivant. Tapez une instruction SQL et cliquez sur Gnrateur de requte pour que l'assistant cre l'instruction SQL votre place. Dans cet exemple, tapez l'instruction SQL suivante : SELECT CustomerID, CompanyName, ContactName, ContactTitle, Country FROM Customers

20

VB NET

Accs aux donnes

4. Cliquez sur Suivant puis sur Terminer pour effectuer le processus. Notez qu'un objet SQLConnection nomm SQLConnection1 et qu'un objet SQLDataAdapter nomm SQLDataAdapter1 apparaissent dans la barre d'tat du formulaire. L'objet SQLConnection1 contient des informations concernant l'accs la base de donnes slectionne. L'objet SQLDataAdapter1 contient une requte dfinissant les tables et les colonnes de la base de donnes laquelle vous voulez accder. Remarque Dans notre exemple, le SQLDataAdapter est slectionn depuis la bote outils car vous utilisez un serveur SQL. Cet objet ne vous permet de vous connecter qu' des bases de donnes du serveur SQL. Si vous souhaitez vous connecter d'autres types de donnes OLEDB, slectionnez l'OLEDBDataAdapter plus gnrique.

Cration de la classe de groupe de donnes


L'tape suivante consiste crer une classe de groupe de donnes base sur la requte slectionne lors de la cration de l'adaptateur de donnes. Pour crer la classe de groupe de donnes : 1. Cliquez avec le bouton droit sur l'objet SQLDataAdapter1, puis sur Gnrer le groupe de donnes. La bote de dialogue Gnrer le groupe de donnes s'affiche.

21

VB NET

Accs aux donnes

2. Entrez dsNorthwind comme nom du nouveau groupe de donnes que vous crez. Assurez-vous d'avoir activ la case cocher Ajouter ce groupe de donnes au concepteur. Cliquez sur OK. Ceci cre le groupe de donnes. Lorsque cette tape est termine, vous voyez un nouveau contrle, dsNorthwind1, dans la barre d'tat de ce formulaire. Ce nouveau contrle est une rfrence au fichier dsNorthwind.xsd qui a galement t ajout votre fentre Explorateur de solutions. dsNorthwind.xsd est une dfinition de schma XML de l'instruction SQL que vous avez tape prcdemment. Il existe une classe derrire ce fichier XSD que vous ne pouvez voir sauf si vous cliquez sur Projet, puis sur Afficher tous les fichiers dans le menu. Vous pouvez ensuite cliquer sur le signe plus qui s'affiche derrire le fichier dsNorthwind.xsd pour voir le fichier dsNorthwind.vb. La classe dsNorthwind.vb a des proprits qui correspondent au groupe de donnes courant et des proprits qui correspondent chaque colonne spcifie dans votre instruction SQL. Bien que cette classe ne vous soit d'aucune utilit, vous devez savoir qu'elle se trouve l.

Ajout d'un contrle de grille de donnes pour afficher les donnes


prsent, vous tes prt crer un formulaire pour afficher les donnes contenues dans le groupe de donnes. Dans cet exemple, vous ajouterez un contrle de grille de donnes unique au formulaire. Le contrle de grille de donnes affichera les donnes contenues dans le groupe de donnes. Voici ce que vous devez faire : 1. En haut de la fentre, cliquez sur l'onglet pour afficher le formulaire frmCustomers. 2. Dans l'onglet Windows Forms de la bote de dialogue, faites glisser un contrle de grille de donnes sur le formulaire. Dimensionnez le contrle selon vos besoins. 3. Appuyez sur F4 pour afficher les proprits du contrle. 4. Pour la proprit DataSource, slectionnez dsNorthwind1. 5. Pour la proprit DataMember, slectionnez Customers. Les tapes que vous venez de terminer ont li le groupe de donnes au contrle de grille de donnes. Il suffit d'une tape supplmentaire pour voir les donnes s'afficher dans le contrle de grille de donnes.

Remplissage du contrle de grille de donnes avec des donnes


Bien que le contrle de grille de donnes soit li au groupe de donnes, ce dernier n'est pas rempli. Nous allons ajouter un boutons de commande qui permettra de remplir la grille.
22

VB NET

Accs aux donnes

Faites glisser un bouton de commande su le formulaire Pour la proprit name, tapez cmdCharger Pour la proprit text, tapez Charger Double cliquez sur le bouton et tapez le code suivant
SqlDataAdapter1.Fill(dsNorthwind1, "Customers")

prsent, vous tes prt voir les donnes de la table Customers affiches dans le contrle de grille de donnes. Il reste une tape avant que vous ne puissiez excuter ce formulaire. Du fait que vous avez modifi le nom du formulaire, vous devez indiquer au projet quel sera le formulaire de dmarrage. 1. Dans la fentre Explorateur de solutions, cliquez sur le nom de votre projet. 2. Cliquez sur le projet avec le bouton droit et choisissez Proprits dans le menu contextuel. 3. Cliquez sur la liste modifiable Objet de dmarrage et choisissez frmCustomers dans la liste. 4. Cliquez sur OK. 5. Appuyez sur F5 pour excuter ce projet et, si vous avez effectu toutes les oprations correctement, vous devez prsent voir s'afficher les donnes des clients dans le contrle de grille de donnes aprs click sur le bouton Chager.

Utilisation des listes modifiables et des zones de listes


L'exemple que vous venez de crer convient bien pour les petits groupes de donnes, mais sera peu efficace si la table customers contient des milliers d'enregistrements. Le problme est qu'il rcupre tous les clients de la table Customers et les affiche dans le contrle de grille de donnes. Bien que cette technique soit trs bonne lorsqu'il s'agit d'une dmonstration, elle se rvle inadapte une application de production. Un serveur de base de donnes est optimis pour traiter des volumes importants de donnes, mais il est souhaitable de ne rcuprer que des ensembles de rsultats de petite taille. L'exemple de la section prcdente serait plus efficace si l'utilisateur commenait par limiter les donnes en slectionnant un pays particulier dans la liste modifiable, puis n'affiche que les clients de ce pays. Cette section vous montre comment crer la liste modifiable dpendante. La section suivante vous montre comment

23

VB NET

Accs aux donnes

utiliser la liste modifiable pour limiter les donnes affiches dans le contrle de grille de donnes. Cet exemple ncessite les tapes de base suivantes : 1. Ajout d'un second adaptateur de donnes au formulaire. 2. Cration d'un second groupe de donnes. 3. Ajout d'une liste modifiable au formulaire. 4. Liaison de la liste modifiable au second adaptateur de donnes. 5. Remplissage de la liste modifiable avec les donnes du second adaptateur de donnes.

Ajout d'un second adaptateur de donnes au formulaire


Avant d'ajouter une liste modifiable au formulaire, commencez par ajouter un second adaptateur de donnes au formulaire. Vous utiliserez cet adaptateur de donnes pour crer un groupe de donnes contenant une liste unique de pays partir de la table Customers. Pour ajouter le second adaptateur de donnes : 1. Dans la bote outils, sous l'onglet Donnes, slectionnez un SQLDataAdapter. Faites-le glisser et dposez-le sur le formulaire. L'Assistant Configuration d'adaptateur de donnes s'affiche. Cliquez sur Suivant. 2. Slectionnez la connexion la base de donnes Northwind que vous avez cre dans l'exemple prcdent. Cliquez sur Suivant. 3. Slectionnez Utiliser des instructions SQL et cliquez sur Suivant. 4. Entrez l'instruction SQL suivante :
SELECT DISTINCT Country FROM Customers

5. Cliquez sur le bouton Options avances de cette bote de dialogue. 6. N'activez pas la case cocher Gnrer des instructions Insert, Update et Delete comme dans la figure 6. Ces instructions ne sont pas ncessaires pour un groupe de donnes utilis uniquement pour remplir une liste modifiable. Cliquez sur OK pour fermer cette bote de dialogue. 7. Cliquez sur Terminer pour gnrer le SQLDataAdapter. Un objet nomm SQLDataAdapter2 sera dsormais ajout la barre d'tat de votre formulaire.

24

VB NET

Accs aux donnes

Gnration du groupe de donnes


1. Cliquez avec le bouton droit sur objet nomm SQLDataAdapter2, puis sur Gnrer le groupe de donnes. La bote de dialogue Gnrer le groupe de donnes s'affiche. 2. Cliquez sur Nouveau et entrez le nom dsCountries. Assurezvous d'avoir activ la case cocher Ajouter ce groupe de donnes au concepteur. Cliquez sur OK. Ceci cre le groupe de donnes. Vous avez ajout un nouvel objet nomm dsCountries1 la barre d'tat et un nouveau fichier XSD nomm dsCountries.xsd l'Explorateur de solutions. Ces deux lments crent ensemble la classe de groupe de donnes et servent effectuer la liaison de donnes sur la liste modifiable que vous allez crer.

Ajout d'une liste modifiable au formulaire


prsent, vous tes prt ajouter la liste modifiable au formulaire. Vous devez agrandir le formulaire et dplacer le contrle de grille de donnes vers le bas pour faire de la place cette nouvelle liste modifiable. Aprs cela, dans la bote outils, vous pouvez faire glisser et dposer une liste modifiable sur le formulaire partir de l'onglet Windows Forms. Placezla au-dessus du contrle de grille de donne.

Liaison de la liste modifiable l'adaptateur de donnes


La liste modifiable que vous avez ajoute n'est lie aucune donne. Pour lier la liste modifiable au groupe de donnes dsCountries : 1. Slectionnez la liste modifiable. 2. Changez le nom pour cboCountry. 3. Dfinissez la proprit DataSource sur dsCountries1. Ceci spcifie la source de donnes partir de laquelle ce contrle de grille de donnes sera rempli. 4. Changez la proprit DropDownStyle pour DropDownList. 5. Dfinissez la proprit DisplayMember sur Customers.Country. Vous devez cliquer sur la liste droulante de la proprit DisplayMember, puis dvelopper Customers pour afficher la liste des colonnes que vous pouvez utiliser. Cette tape dsigne la colonne de la source de donnes utilise pour remplir le contrle de grille de donnes.

25

VB NET

Accs aux donnes

6. Dfinissez la proprit ValueMember du contrle de grille de donnes sur Customers.Country. La proprit ValueMember sert dsigner la valeur courante lorsqu'un lment est slectionn.

Remplissage de la liste modifiable avec des donnes


Comme pour le contrle de grille de donnes, vous devez crire le code permettant de remplir la liste modifiable de donnes. Ce code est ajout la procdure d'vnement Load.
Private Sub frmCustomers_Load SqlDataAdapter2.Fill(DsCountries1, "Customers") End Sub

Affichage des donnes en fonction d'une requte paramtre


prsent que la liste modifiable est charge avec les pays, il est temps d'utiliser le pays slectionn dans la liste modifiable pour slectionner les clients charger dans le contrle de grille de donnes. Les tapes principales sont les suivantes : 1. Modifiez la proprit SelectCommand de l'objet SqlDataAdapter1 pour qu'il accepte un paramtre du pays pour lequel vous voulez afficher des donnes. 2. Ajoutez le code qui s'excute lorsque l'utilisateur slectionne un lment dans la liste modifiable.

Modifiez la proprit SelectCommand


L'tape suivante consiste modifier la proprit SelectCommand de l'adaptateur de donnes de manire ce qu'il soit bas sur la requte paramtre. Les tapes sont les suivantes : 1. Dans la barre d'tat du formulaire, cliquez sur l'objet SqlDataAdapter1. 2. Appuyez sur F4 pour ouvrir la fentre Proprits. 3. ct de la proprit SelectCommand, cliquez sur le signe plus pour dvelopper la liste des sous-proprits. 4. Cliquez sur la proprit CommandText. Cliquez sur Gnrer (...) pour afficher la bote de dialogue Gnrateur de requte. 5. Ajoutez une clause WHERE afin que l'instruction SQL ressemble ceci : SELECT CustomerID, CompanyName, ContactName, Country

26

VB NET

Accs aux donnes

FROM Customers WHERE Country = @CountryParam 6. Cliquez sur OK pour accepter cette modification. 7. Cliquez sur l'objet SQLDataAdapter1. 8. Cliquez sur Donnes, sur Gnrer le groupe de donnes, puis sur OK pour rgnrer le groupe de donnes existant.

Ajoutez le code qui s'excute lorsque l'utilisateur slectionne un lment dans la liste modifiable
La partie finale de code remplit le contrle de grille de donnes lorsqu'un pays est slectionn dans la liste modifiable cboCountry. Les tapes principales sont les suivantes : 1. Rpondez l'vnement SelectedIndexChanged. 2. Dfinissez le paramtre dans le groupe de donnes avec les donnes rcupres partir de l'lment slectionn dans la liste modifiable. 3. Remplissez le groupe de donnes l'aide de ce paramtre. Suivez ces tapes pour ajouter le code et permettre que cela fonctionne. 1. Ouvrez le formulaire en mode cration. 2. Double-cliquez sur la liste modifiable cboCountry pour afficher la procdure d'vnement SelectedIndexChanged. Il s'agit de l'vnement dclench lorsque vous choisissez un nouvel lment dans la liste modifiable. 3. crivez le code suivant dans cette procdure.
Private Sub cboCountry_SelectedIndexChanged ' Obtention de l'objet Parameter et dfinition de sa valeur SqlDataAdapter1.SelectCommand.Parameters.Item("@CountryParam").Value = _ cboCountry.SelectedValue ' Suppression du groupe de donnes DsNorthwind1.customers.rows.Clear() ' Chargement du groupe de donnes en utilisant la valeur du paramtre SqlDataAdapter1.Fill(DsNorthwind1, "Cutomers") End Sub

Vous devez utiliser l'objet SelectCommand de l'adaptateur de donnes pour rcuprer l'objet Parameter spcifi. Vous pouvez ensuite dfinir la proprit Value de ce paramtre sur la proprit SelectedValue de la liste modifiable. La proprit SelectedValue est remplie avec le nom du pays car vous avez dfini la proprit ValueMember de la liste modifiable pour qu'elle utilise le champ Country du groupe de donnes. Aprs avoir rempli cette valeur, vous pouvez remplir le groupe de donnes du client et

27

VB NET

Accs aux donnes

le contrle de grille de donnes sera rempli automatiquement par les seuls clients du pays slectionn.

Formulaire de mise jour dune table


Les exemples prcdents ont tous affich les donnes dans un contrle de grille de donnes. Lorsque vous crez des applications, il est galement ncessaire d'afficher des colonnes individuelles dans des zones de texte d'un formulaire pour les diter. Bien que le propos de ce document ne soit pas de vous faire apprendre l'dition des donnes, vous allez apprendre afficher des donnes dans les zones de texte. Les tapes principales sont les suivantes : 1. Crer un formulaire Windows. 2. Crer et configurer le groupe de donnes auquel vous voulez lier le formulaire. 3. Ajouter des contrles au formulaire et liez-les au groupe de donnes. 4. Ajouter des boutons de commande permettant l'utilisateur de naviguer d'une ligne l'autre.

Ajout de contrles au formulaire et liaison de ces contrles au groupe de donnes


Ajoutez des contrles au formulaire et dfinissez leurs proprits comme dans le tableau 1.

28

VB NET

Accs aux donnes

Tableau des contrles utiliss pour crer le formulaire Type de contrle Proprit Valeur Label Name Label1 Text Code TextBox Name txtCustomerID Label Name Label2 Text Nom TextBox Name txtCompanyName Label Name Label3 Text Contact TextBox Name txtContactName CommandButton Name cmdPremier Text << CommandButton Name cmdPrecedent Text < CommandButton Name cmdSuivant Text > CommandButton Name cmdDernier Text >> CommandButton Name cmdCharger Text Charger CommandButton Name cmdAjouter Text Ajouter CommandButton Name cmdSupprimer Text Supprimer CommandButton Name cmdMAJ Text Mettre jour Vous devez prsent lier chaque zone de texte une colonne du groupe de donnes. Pour ce faire : 1. Slectionnez la zone de texte que vous voulez lier. 2. Appuyez sur F4 pour afficher la fentre Proprits. 3. Cliquez pour dvelopper les proprits DataBindings. 4. Sous DataBindings, slectionnez la proprit Text. 5. Ouvrez la liste modifiable et liez chaque zone de texte au champ appropri. Par exemple, pour lier la zone de texte txtCustomerID au champ CustomerID, cliquez sur le signe plus de

29

VB NET

Accs aux donnes

DsCustomers1, sur le signe plus de Customers, et slectionnez le champ CustomerID. Ecrivez le code permettant de remplir le formulaire de donnes. Pour cela double cliquez sur le bouton charger puis tapez le code :
DsNorthwind1.customers.Clear() SqlDataAdapter1.Fill(DsCustomers1, "Clients") End Sub

L'objet CurrencyManager
Assure un suivi de la position et supervise les liaisons une source de donnes. Il existe, dans le formulaire, un objet CurrencyManager pour chaque source de donnes discrte laquelle vous vous liez. Si les contrles du formulaire sont tous lis la mme source (par exemple, si plusieurs contrles TextBox sont lis la mme table de donnes), ils partagent alors le mme CurrencyManager

Ajout de boutons de commande permettant l'utilisateur de naviguer d'une ligne l'autre


Commenons par dclarer une donne membre de type CurrencyManager dans notre formulaire que nous appellerons cmCustomers. Private cmCustomers as CurrencyManager Nous devons ensuite rcuprer le CurrencyManager au chargement du formulaire partir de la collection BindingContext.
Private Sub Form1_Load cmCustomers = BindingContext(dsNorthwind1, Customers) End Sub

Code des boutons de navigation


Private Sub cmdPrecedent_Click cmCustomers Position -= 1 End Sub Private Sub cmdPremier_Click cmCustomers.Position = 0 End Sub Private Sub cmdDernier_Click cmCustomers.Position = dsNorthwind1.Customers.Rows.Count - 1 End Sub

Ajout de boutons de commande de mise jour

30

VB NET

Accs aux donnes

Le code suivant permet lajout dun nouvel enregistrement, la suppression dun enregistrement existant et enfin la mise jour de la base de donnes
Private Sub cmdAjouter_Click cmCustomers.AddNew() End Sub Private Sub cmdSupprimer_Click cmCustomers.RemoveAt(cmCustomers.Position) End Sub Private Sub cmdMAJ_Click daCustomers.Update(dsNorthwind1) End Sub

31

VB NET

Accs aux donnes

Chapitre 7 : Quelques contrles dpendants


Zone de texte, Label

Pour lier une zone de texte une source de donnes : En mode design, utiliser la proprit text du DataBinding.

Dans lexemple ci-dessus, la zone de texte TextBox1 est lie a champs OrderID de la table Orders du dataSet DsNorthwind1. Cette liaison peut tre effectue au cours de lexcution comme suit :
TextBox1.DataBindings.Add(New System.Windows.Forms.Binding("Text", DsNorthwind1, "Orders.OrderID"))

Un label peut tre li de la mme manire quune zone de texte, seulement il ne peut tre utilis que pour afficher des donnes.

DateTimePeacker

32

VB NET

Accs aux donnes

Ce contrle est utilis pour permettre l'utilisateur de slectionner une date et/ou une heure, et pour afficher cette valeur date et heure au format spcifi. Vous pouvez restreindre la fourchette de dates et d'heures qu'il sera possible de slectionner en dfinissant les proprits MinDate et MaxDate.

La proprit Format dtermine le format du contrle qui peut tre Long, Short, Time ou Custom. Si la proprit Format a pour valeur Custom, vous pouvez crer votre propre style de format en dfinissant la proprit CustomFormat. Afin d'utiliser un contrle de style up-down pour slectionner la valeur de date-heure, affectez la proprit ShowUpDown la valeur true. Lors de sa slection, le contrle Calendar ne se droulera pas. La date et l'heure peuvent tre rgles par la slection de chaque lment individuellement et par l'utilisation des boutons haut et bas pour en modifier la valeur. Pour lier ce contrle : En mode cration, utilisez la proprit Value du DataBinding.

33

VB NET

Accs aux donnes

Cet exemple permet de lier le contrle DateTimePeaker1 au champ OrderDate de la table Orders. Au cours de lexcution, tapez le code suivant :
DateTimePicker1.DataBindings.Add(New System.Windows.Forms.Binding("Value", DsNorthwind1, "Orders.OrderDate"))

ComboBox, ListBox
Un ComboBox affiche un champ d'dition associ un ListBox, permettant l'utilisateur de slectionner dans la liste ou d'entrer un nouveau texte. La proprit DropDownStyle dtermine le style de la zone de liste droulante afficher. Pour afficher toujours une liste que l'utilisateur ne peut pas modifier, utilisez un contrle ListBox. En plus de l'affichage et de la fonctionnalit de slection, le ComboBox comprend galement des fonctionnalits qui vous permettent d'ajouter efficacement des lments au ComboBox et de rechercher du texte dans les lments de la liste. Les mthodes BeginUpdate et EndUpdate vous permettent d'ajouter un grand nombre d'lments au ComboBox sans repeindre le contrle chaque fois qu'un lment est ajout la liste. Les mthodes FindString et FindStringExact vous permettent de rechercher un lment dans la liste qui contient une chane recherche spcifique. La proprit Text spcifie la chane affiche dans le champ d'dition. La proprit SelectedIndex renvoie ou dfinit l'lment en cours.

Pour lier ce contrle une source de donnes : En mode cration utilisez les proprits suivantes

34

VB NET

Accs aux donnes

DataSource : indique la source qui sera utilise pour ajouter des objets au contrle. DisplayMember : spcifie le champ qui sera affich dans le ComboBox. ValueMember : Nom de champ qui sera utilis comme valeur retenue aprs le choix de lutilisateur. SelectedValue du DataBinding : Champ de la table lie au contrle. Text du DataBinding : Champ qui sera affich dans la zone de texte.

Au cours de lexcution, la liaison peut tre faite avec le code suivant :


ComboBox1.DataBindings.Add(New System.Windows.Forms.Binding("SelectedValue", DsNorthwind1, "Orders.CustomerID")) ComboBox1.DataBindings.Add(New System.Windows.Forms.Binding("Text", DsNorthwind1, "Customers.CompanyName")) ComboBox1.DataSource = DsNorthwind1.Customers ComboBox1.DisplayMember = "CompanyName" ComboBox1.ValueMember = "CustomerID"

35

VB NET

Accs aux donnes

Chapitre 8 : Cration et utilisation de DataViews


Un DataView vous permet de crer diffrentes vues des donnes stockes dans un DataTable, possibilit qui est souvent utilise dans les applications de liaison de donnes. En utilisant un DataView, vous pouvez prsenter les donnes d'une table en appliquant diffrents ordres de tri et filtrer les donnes en fonction d'un tat de ligne ou d'une expression de filtre.

Cration d'un DataView


Cration dun dataView en mode conception :

1. Commencez par crer un dataAdapter et un dataset 2. A partir de la boite outils, glissez un dataView sur votre formulaire et renseignez sa proprit Table. 3. Liez ensuite la grille de donnes au dataview que vous venez de crer Cration dun dataView au cours de lexcution : Vous pouvez utiliser le constructeur de DataView ou crer une rfrence la proprit DefaultView du DataTable. L'exemple de code suivant cre un DataView li la table Customers avec un filtre sur les clients des USA et un tri sur le champ contactName.
Dim dvCustomers As DataView = New DataView(DsNorthwind1.Customers, _ "Country = 'USA'", _

36

VB NET

Accs aux donnes

"ContactName", _ DataViewRowState.CurrentRows)

L'exemple de code suivant montre comment obtenir une rfrence au DataView par dfaut d'un DataTable l'aide de la proprit DefaultView de la table.
Dim dvProduits As DataView = dsNorthwind1.Customers.DefaultView

Filtrage par tat de ligne

l'aide de la proprit RowStateFilter, vous pouvez spcifier les versions de lignes afficher. Par exemple, si la proprit RowStateFilter est dfinie DataViewRowState.Deleted, le DataView expose la version d'origine de toutes les lignes supprimes, car ces lignes n'ont plus de version actuelle. Vous pouvez dterminer quelle version d'une ligne est expose l'aide de la proprit RowVersion du DataRowView.

37

VB NET

Accs aux donnes

Le tableau suivant prsente les options de DataViewRowState. DataViewRowState CurrentRows Added Deleted ModifiedCurrent ModifiedOriginal None OriginalRows Unchanged Description Version actuelle de toutes les lignes inchanges, ajoutes et modifies. Il s'agit de la valeur par dfaut. Version actuelle de toutes les lignes ajoutes. Version d'origine de toutes les lignes supprimes. Version actuelle de toutes les lignes modifies. Version d'origine de toutes les lignes modifies. Aucune ligne. Version d'origine de toutes les lignes inchanges, modifies et supprimes. Version actuelle de toutes les lignes inchanges.

Tri et filtrage de donnes l'aide d'un DataView


Le DataView offre diffrentes possibilits pour le tri et le filtrage des donnes d'un DataTable :

En utilisant la proprit Sort, vous pouvez spcifier un ordre de tri en fonction d'une ou de plusieurs colonnes et inclure des paramtres ASC (ordre croissant) et DESC (ordre dcroissant). Vous pouvez utiliser la proprit ApplyDefaultSort pour crer automatiquement un ordre de tri, croissant, bas sur la ou les colonnes cls primaires de la table. ApplyDefaultSort est applicable uniquement lorsque la proprit Sort est une rfrence null ou une chane vide et lorsqu'une cl primaire est dfinie dans la table. En utilisant la proprit RowFilter, vous pouvez spcifier des sous-ensembles de lignes en fonction des valeurs de leurs colonnes.

L'exemple de code suivant cre une vue faisant apparatre tous les produits pour lesquels la quantit en stock est infrieure ou gale au niveau de passage d'une nouvelle commande, tris d'abord par ID de fournisseur, puis par nom de produit.
Dim prodView As DataView = New DataView(prodDS.Tables("Products"), _ "UnitsInStock <= ReorderLevel", _ "SupplierID, ProductName", _ DataViewRowState.CurrentRows)

Recherche de donnes dans un DataView


l'aide des mthodes Find et FindRows du DataView, vous pouvez rechercher des lignes en fonction des valeurs de leur cl de tri. Le respect ou le non-respect de la casse des valeurs de recherche des mthodes Find et FindRows est dtermin par la proprit CaseSensitive du
38

VB NET

Accs aux donnes

DataTable sous-jacent. Pour qu'un rsultat soit retourn, les valeurs de recherche doivent correspondre aux valeurs des cls de tri existantes dans leur intgralit. La mthode Find retourne un entier avec l'index du DataRowView qui correspond aux critres de recherche. Si plusieurs lignes correspondent aux critres de recherche, seul l'index du premier DataRowView correspondant est retourn. Si aucune correspondance n'est trouve, Find retourne -1. Pour retourner des rsultats de recherche qui correspondent plusieurs lignes, vous pouvez utiliser la mthode FindRows. La mthode FindRows fonctionne de la mme manire que Find, cette exception qu'elle retourne un tableau DataRowView faisant rfrence toutes les lignes du DataView qui prsentent une correspondance. Si aucune correspondance n'est trouve, le tableau DataRowView sera vide. Pour utiliser les mthodes Find ou FindRows, vous devez spcifier un ordre de tri soit en dfinissant ApplyDefaultSort true, soit en utilisant la proprit Sort. Si aucun ordre de tri n'est spcifi, une exception est leve. L'exemple de code suivant illustre la mthode Find appele sur un DataView avec un ordre de tri dfini sur une seule colonne.
Dim custView As DataView = New DataView(custDS.Tables("Customers"), "", _ "CompanyName", DataViewRowState.CurrentRows) Dim rowIndex As Integer = custView.Find("The Cracker Box") If rowIndex = -1 Then Console.WriteLine("Non trouv.") Else Console.WriteLine("{0}, {1}", _ custView(rowIndex)("CustomerID").ToString(), _ custView(rowIndex)("CompanyName").ToString()) End If

Si votre proprit Sort spcifie plusieurs colonnes, vous devez passer un tableau d'objets avec les valeurs de recherche pour chaque colonne incluse dans l'ordre spcifi par la proprit Sort, comme dans l'exemple de code suivant.
Dim custView As DataView = New DataView(custDS.Tables("Customers"), "", _ "CompanyName, ContactName", _ DataViewRowState.CurrentRows) Dim foundRows() As DataRowView = custView.FindRows(New object() {"The Cracker Box", "Liu Wong"})

39

VB NET

Accs aux donnes

If foundRows.Length = 0 Then Console.WriteLine("Non trouv.") Else Dim myDRV As DataRowView For Each myDRV In foundRows Console.WriteLine("{0}, {1}", myDRV("CompanyName").ToString(), myDRV("ContactName").ToString()) Next End If

Modification de donnes l'aide d'un DataView


Un DataView est, par dfaut, une vue en lecture seule de donnes. Toutefois, vous pouvez utiliser le DataView pour ajouter, supprimer ou modifier des lignes de donnes dans la table sous-jacente en dfinissant l'une des trois proprits de type Boolean du DataView. Ces proprits sont AllowNew, AllowEdit et AllowDelete. Elles sont dfinies true par dfaut et vous permettent de spcifier si vous pouvez modifier les donnes du DataTable sous-jacent du DataView. L'exemple de code suivant dsactive la possibilit de supprimer des lignes l'aide du DataView et ajoute une nouvelle ligne la table sous-jacente l'aide du DataView.
Dim custTable As DataTable = custDS.Tables("Customers") Dim custView As DataView = custTable.DefaultView custView.Sort = "CompanyName" custView.AllowDelete = False Dim newDRV As DataRowView = custView.AddNew() newDRV("CustomerID") = "ABCDE" newDRV("CompanyName") = "ABC Products" newDRV.EndEdit()

40

VB NET

Accs aux donnes

Chapitre 9 : Cration d'un contrle utilisateur


Les contrles utilisateur offrent un moyen de crer et de rutiliser des interfaces graphiques personnalises. Un contrle utilisateur est pour l'essentiel un composant dot d'une reprsentation visuelle. Il peut tre constitu d'un ou de plusieurs contrles Windows Forms, de composants ou de blocs de code, lesquels peuvent dvelopper des fonctionnalits en validant des entres de l'utilisateur, en modifiant des proprits d'affichage ou en effectuant d'autres tches imposes par le crateur du contrle. Les contrles utilisateur peuvent tre placs dans les Windows Forms de la mme faon que les autres contrles.

Cration du projet
Pour crer la bibliothque de contrles ctlClockLib et le contrle ctlClock 1. Dans le menu Fichier, pointez sur Nouveau, puis slectionnez Projet pour afficher la bote de dialogue Nouveau projet. 2. Slectionnez le modle de projet Bibliothque de contrles Windows dans la liste Projets Visual Basic, et tapez ctlClockLib dans la zone Nom. 3. Recherchez l'instruction Class, Public Class UserControl1, et remplacez UserControl1 par ctlClock pour changer le nom du composant. 4. Dans l'Explorateur de solutions, cliquez sur UserControl1, puis dans la fentre Proprits, remplacez la proprit FileName par ctlClock.vb. 5. Dans le menu Fichier, choisissez Enregistrer tout pour enregistrer le projet.

Ajout de contrles Windows et de composants un contrle utilisateur


Pour ajouter un contrle Label et un contrle Timer votre contrle utilisateur 1. Dans la bote outils, cliquez sur l'onglet Windows Forms puis double-cliquez sur Label. 2. Dans le concepteur, cliquez sur Label1. Dans la fentre Proprits, dfinissez les proprits suivantes. Proprit Name Text TextAlign Font.Size Substitution lblDisplay (espace blanc) MiddleCenter 14

3. Dans la bote outils, cliquez sur l'onglet Windows Forms puis double-cliquez sur Timer.

41

VB NET

Accs aux donnes

Une minuterie tant un composant, elle n'a pas de reprsentation visuelle au moment de l'excution. Elle n'est donc pas affiche avec les contrles dans le Concepteur de contrles utilisateur, mais apparat dans la barre d'tat des composants. 4. Dans la barre d'tat des composants, cliquez sur Timer1 et attribuez la proprit Interval la valeur 1000 et la proprit Enabled la valeur True. La proprit Interval dtermine la frquence des graduations du composant Timer. chaque graduation, le composant Timer1 excute le code de l'vnement Timer1_Tick. L'intervalle reprsente le nombre de millisecondes entre deux graduations. 5. Dans la barre d'tat des composants, double-cliquez sur Timer1 pour accder l'vnement Timer1_Tick de ctlClock. 6. Modifiez le code pour qu'il ressemble ceci :
Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As _ System.EventArgs) ' Causes the label to display the current time lblDisplay.Text = Format(Now, "hh:mm:ss") End Sub

Ce code dclenche toujours l'affichage de l'heure actuelle dans lblDisplay. Comme l'intervalle de Timer1 a t fix 1 000, cet vnement est dclench toutes les mille millisecondes, mettant ainsi jour l'heure actuelle toutes les secondes. 7. Modifiez la mthode de telle manire qu'elle puisse tre substitue.
Protected Overridable Sub Timer1_Tick(ByVal sender As Object, ByVal _ e As System.EventArgs) Handles Timer1.Tick

8. Dans le menu Fichier, choisissez Enregistrer ctlClock pour enregistrer le projet.

Ajout de proprits un contrle utilisateur


Votre contrle d'horloge contient dsormais un contrle Label et un composant Timer dots chacun de leurs propres proprits inhrentes. Les proprits de ces contrles ne seront pas disponibles individuellement aux futurs utilisateurs de votre contrle ; toutefois, vous pouvez crer et exposer des proprits personnalises en crivant pour ce faire les blocs de code appropris. Pour ajouter une proprit votre contrle utilisateur 1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur ctlClock.vb, puis sur Afficher le code dans le menu contextuel.

42

VB NET

Accs aux donnes

2. Recherchez l'instruction Inherits System.Windows.Forms.UserControl. Sous cette instruction, tapez :


Private colFColor as Color Private colBColor as Color

Ces instructions crent les variables prives que vous utiliserez pour stocker les valeurs des proprits que vous tes sur le point de crer. 3. Tapez le code suivant sous les dclarations de variable de l'tape 2 :
' Dclaration des proprits Property ClockBackColor() as Color ' Renvoie la valeur de la proprit colBColor. Get Return colBColor End Get ' Modifie la valeur de la prprit colBColor Set(ByVal Value as Color) colBColor = Value lblDisplay.BackColor = ColBColor End Set End Property Property ClockForeColor() as Color Get Return colFColor End Get Set(ByVal Value as Color) colFColor = Value lblDisplay.ForeColor = ColFColor End Set End Property

Le code prcdent met deux proprits personnalises, ClockForeColor et ClockBackColor, la disposition des futurs utilisateurs du contrle en appelant l'instruction Property. Les instructions Get et Set assurent le stockage et l'extraction de la valeur de proprit ainsi que du code permettant d'implmenter les fonctionnalits appropries la proprit. 4. Dans le menu Fichier, choisissez Enregistrer ctlClock.vb pour enregistrer le projet.

43

VB NET

Accs aux donnes

Test du contrle
Les contrles ne sont pas des projets autonomes ; ils doivent tes placs dans un conteneur. Pour tester votre contrle, vous devez fournir un projet de test dans lequel il puisse s'excuter. Pour gnrer le contrle

Dans le menu Gnrer, cliquez sur Gnrer ctlClockLib.

Pour crer un projet de test 1. Dans le menu Fichier, pointez sur Ajouter un projet et cliquez sur Nouveau projet pour ouvrir la bote de dialogue Ajouter un nouveau projet. 2. Cliquez sur Application Windows, puis tapez Test et cliquez sur OK dans la zone Nom. 3. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nud Rfrences de votre projet de test. Cliquez sur Ajouter une rfrence pour afficher la bote de dialogue Ajouter une rfrence. 4. Cliquez sur l'onglet Projets. Votre projet est rpertori sous Nom du projet. 5. Double-cliquez sur votre projet. Une fois que vous avez ajout votre rfrence, vous pouvez placer le contrle dans votre formulaire. Pour tester le contrle 1. Dans la bote outils, cliquez sur Windows Forms et faites dfiler la fentre vers le bas jusqu' ce que s'affiche l'icne reprsentant le contrle ctlClock. 2. Double-cliquez sur l'icne ctlClock. 3. Slectionnez l'icne et amenez la souris sur votre formulaire. 4. Maintenez le bouton gauche enfonc pendant que vous dplacez la souris sur le formulaire. 5. Dans le concepteur, cliquez sur l'une des instances de ctlClock. 6. Dans la fentre Proprits, recherchez la proprit ClockBackColor, puis slectionnez-la pour afficher la palette de couleurs. 7. Choisissez une couleur en cliquant dessus. 8. Utilisez une squence d'vnements similaire pour vrifier que la proprit ClockForeColor fonctionne comme prvu.

Hritage d'un contrle utilisateur


Votre contrle utilisateur peut tre employ comme base pour la construction d'autres contrles. Le processus consistant driver une classe d'une classe de base est appel hritage. Dans cette section, vous crerez un contrle utilisateur appel ctlAlarmClock. Ce contrle sera driv de son contrle parent, ctlClock. Vous apprendrez dvelopper les fonctionnalits du contrle ctlClock en substituant les mthodes parentes et en ajoutant de nouvelles mthodes et proprits.

44

VB NET

Accs aux donnes

Cration du contrle hrit


La premire tape de la cration d'un contrle hrit consiste le driver de son parent. Cette opration cre un contrle qui possde toutes les proprits, mthodes et caractristiques graphiques du contrle parent, mais peut galement servir de base pour l'ajout de fonctionnalits nouvelles ou modifies. Pour crer le contrle hrit 1. 2. 3. 4. 5. Dans l'Explorateur de solutions, cliquez sur ctlClockLib. Dans le menu Projet, choisissez Ajouter un contrle hrit. Dans la zone Nom, tapez ctlAlarmClock.vb et cliquez sur Ouvrir. Sous Nom du composant, double-cliquez sur ctlClock. Dans l'Explorateur de solutions, parcourez les projets en cours. Notez qu'un fichier appel ctlAlarmClock a t ajout.

Ajout de proprits d'alarme


Vous ajoutez des proprits un contrle hrit comme vous le feriez pour un contrle utilisateur. Vous allez maintenant utiliser la syntaxe de dclaration de proprit pour ajouter deux proprits votre contrle : AlarmTime, qui stocke la valeur de date et d'heure laquelle l'alarme se dclenche et AlarmSet qui indique si l'alarme est active ou non. Pour ajouter des proprits votre contrle utilisateur 1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur ctlAlarmClock et slectionnez Afficher le code dans le menu contextuel. 2. Recherchez l'instruction Inherits. Notez que votre contrle hrite de ctlClockLib.ctlClock. Sous l'instruction Inherits, tapez le code suivant :
Private dteAlarmTime As Date Private blnAlarmSet As Boolean Public Property AlarmTime() As Date Get Return dteAlarmTime End Get Set(ByVal Value as Date) dteAlarmTime = Value End Set End Property Public Property AlarmSet() As Boolean Get Return blnAlarmSet

45

VB NET

Accs aux donnes

End Get Set(ByVal Value as Boolean) blnAlarmSet = Value End Set End Property

Ajout l'interface graphique de votre contrle


Votre contrle hrit possde une interface visuelle identique celle du contrle dont il a hrit. Il possde les mmes contrles constitutifs que son contrle parent, mais leurs proprits ne sont pas disponibles tant qu'elles ne sont pas spcifiquement exposes. Vous pouvez faire des ajouts une interface graphique comme vous le feriez pour n'importe quel contrle utilisateur. Pour enrichir l'interface visuelle de votre rveil, vous allez ajouter un contrle qui clignotera lorsque l'alarme sonnera. Pour ajouter le contrle Label 1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur ctlAlarmClock et slectionnez Afficher le concepteur dans le menu contextuel. 2. Cliquez sur la partie affichage du contrle et observez ce qui se passe dans la fentre Proprits. 3. Ajoutez un contrle Label votre contrle utilisateur. 4. l'aide de la souris, placez le contrle Label immdiatement sous la zone d'affichage. Dans la fentre Proprits, dfinissez les proprits suivantes : Proprit Name Text TextAlign Visible Valeur lblAlarm Alarm Is Sounding! Middle Center false

Ajout de fonctionnalits d'alarme


Vous allez ajouter du code pour comparer l'heure actuelle avec celle de l'alarme et, si les heures sont identiques, dclencher une alarme la fois sonore et clignotante. En substituant la mthode Timer1_Tick de ctlClock et en lui ajoutant du code supplmentaire, vous dveloppez les fonctionnalits de ctlAlarmClock tout en conservant les fonctionnalits inhrentes de ctlClock. Pour substituer la mthode Timer1_Tick de ctlClock 1. Dans l'diteur de code, recherchez l'instruction Private blnAlarmSet As Boolean. Immdiatement sous cette instruction, tapez l'instruction suivante :
Dim blnColorTicker as Boolean

46

VB NET

Accs aux donnes

2. Dans l'diteur de code, recherchez l'instruction End Class. Elle se trouve au bas de la page. 3. Juste avant l'instruction End Class, ajoutez le code suivant :
Protected Overrides Sub Timer1_Tick(ByVal sender As Object, ByVal e _ As System.EventArgs) ' Appelle la mthode Timer1_Tick de ctlClock. MyBase.Timer1_Tick(sender, e) ' Vrifie si lalarme est active. If AlarmSet = False Then Exit Sub End If ' si date et heure = date et heure de lalarme If AlarmTime.Date = Now.Date And AlarmTime.Hour = Now.Hour And _ AlarmTime.Minute = Now.Minute Then Beep() lblAlarm.Visible = True If blnColorTicker = False Then lblAlarm.BackColor = Color.PeachPuff blnColorTicker = True Else lblAlarm.BackColor = Color.Plum blnColorTicker = False End If Else lblAlarm.Visible = False End If End Sub

Votre contrle de rveil est presque termin. Il ne reste plus qu' implmenter un moyen de le dsactiver. Pour ce faire, vous ajoutez du code la mthode lblAlarm_Click. Pour implmenter la mthode de dsactivation 1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur ctlAlarmClock.vb, puis cliquez sur Concepteur de vues. 2. Dans le concepteur, double-cliquez sur lblAlarm. L'diteur de code s'ouvre la ligne Protected Sub lblAlarm_Click.

47

VB NET

Accs aux donnes

Modifiez la mthode pour qu'elle ressemble ceci :


Protected Sub lblAlarm_Click(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles lblAlarm.Click ' Turns off the alarm. AlarmSet = False ' Hides the flashing label. lblAlarm.Visible = False End Sub

3. Dans le menu Fichier, choisissez Enregistrer ctlAlarmClock.vb pour enregistrer le projet.

Test du contrle hrit


Pour gnrer et ajouter votre contrle un formulaire de test 1. Dans l'Explorateur de solutions, cliquez sur ctlClockLib. Dans le menu Gnrer, cliquez sur Gnrer ctlClockLib. 2. Ajoutez un nouveau projet Application Windows la solution et nommez-le Test2. 3. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nud Rfrences de votre projet de test. Cliquez sur Ajouter une rfrence pour afficher la fentre Ajouter une rfrence. Cliquez sur l'onglet Projets. Le projet ctlClockLib est rpertori sous Nom du projet. Double-cliquez sur ctlClockLib ; il apparat dsormais dans la fentre Composants slectionns. 4. Dans la bote outils, cliquez sur Windows Forms. 5. Faites dfiler la fentre vers le bas jusqu' ce que l'icne de ctlAlarmClock apparaisse. 6. Double-cliquez sur ctlAlarmClock pour ajouter une copie de ctlAlarmClock votre formulaire. 7. Recherchez DateTimePicker et double-cliquez dessus pour ajouter un contrle DateTimePicker votre formulaire, puis ajoutez un contrle Label en doublecliquant sur tiquette. 8. l'aide de la souris, placez les contrles dans le formulaire un endroit adquat. 9. Dfinissez comme suit les proprits de ces contrles : Contrle Label1 Proprit Text Name DateTimePicker1 Name Format Value (laisser vide) lblTest dtpTest Time

10. Dans le concepteur, double-cliquez sur dtpTest. L'diteur de code s'ouvre sur Protected Sub dtpTest_ValueChanged. 11. Modifiez le code pour qu'il ressemble ceci :

48

VB NET

Accs aux donnes

Protected Sub dtpTest_ValueChanged(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles dtpTest.ValueChanged ctlAlarmClock1.AlarmTime = dtpTest.Value ctlAlarmClock1.AlarmSet = True _ lblTest.Text = "Alarm Time is " & Format(ctlAlarmClock1.AlarmTime, "hh:mm") End Sub

12. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Test2 puis slectionnez Dfinir comme projet de dmarrage dans le menu contextuel. 13. Dans le menu Dboguer, cliquez sur Dmarrer. Le programme de test dmarre. Notez que l'heure actuelle est mise jour dans le contrle ctlAlarmClock et que l'heure de dmarrage est affiche dans le contrle DateTimePicker. 14. Cliquez sur le contrle DateTimePicker dans lequel sont affiches les minutes de l'heure. 15. l'aide du clavier, dfinissez pour les minutes une valeur suprieure d'une minute l'heure actuelle affiche dans ctlAlarmClock. L'heure de dfinition de l'alarme apparat dans lblTest. 16. Attendez que l'heure affiche atteigne l'heure de dfinition de l'alarme. Lorsque l'heure affiche atteint celle laquelle l'alarme est dfinie, le signal sonore se fait entendre et lblAlarm se met clignoter. Dsactivez l'alarme en cliquant sur lblAlarm. Vous pouvez maintenant rinitialiser l'alarme.

49

VB NET

Accs aux donnes

Chapitre 10 : Cration d'tats Crystal Reports


Crystal Reports est l'outil de cration d'tats fourni avec Visual Studio .NET. Nous allons voir comment crer un tat aliment par des donnes extraites d'une application .NET et comment afficher l'tat gnr dans une fentre Windows.

Cration du dataset typ


Nous devons commencer par crer un dataset typ. Pour que notre tat puisse consommer les donnes de notre dataset celui-ci doit tre typ. En effet, lors de la cration de l'tat il faut bien que Crystal Reports puisse dterminer le nom et le type des champs pour les donnes qui lui serviront gnrer le rapport.

Cration de l'tat
Tout d'abord il faut ajouter un tat Crystal Reports au projet. 1. Dans l'Explorateur de solutions Visual Studio .NET, cliquez avec le bouton droit de la souris sur votre projet pour afficher le menu contextuel. 2. Pointez sur Ajouter et cliquez sur Ajouter un nouvel lment. 3. Dans la bote de dialogue Ajouter un nouvel lment, slectionnez Etat Crystal Reports dans la zone Modles. Cliquez sur Ouvrir. 4. Dans la Collection d'tats Crystal Reports, slectionnez une des options suivantes : Utilisation de l'Expert Etat vous guide tout au long du processus de cration d'tat et ajoute vos choix au Crystal Report Designer. En tant qu'tat vide ouvre le Crystal Report Designer. Dans un tat existant cre un nouvel tat avec la mme conception qu'un autre tat que vous spcifiez. 5. Cliquez sur OK.
Nous allons ensuite utiliser l'expert d'tat pour crer rapidement notre tat. Dans l'onglet "Donnes" dvelopper l'arbre ADO.NET, puis le dataset

50

VB NET

Accs aux donnes

Cliquez sur "Insrer la table" Ajoutez les champs de votre tat

51

VB NET

Accs aux donnes

Passer directement l'onglet "Diagramme". Les onglets "Groupe" "Total" et "Nsup" permettent de classer les donnes et d'afficher des totaux par colonne et par groupe. Nous allons raliser un diagramme sectoriel sur la quantit de produits commands. Choisir un diagramme de type "sectoriel", faire "suivant". Slectionner "sur changement" puis ajouter le champ "Rf produit" Slectionner le champ "Units commandes" dans "Afficher des valeurs". Faire "Terminer".

Voil, notre tat Crystal Reports est enfin cr. Voyons maintenant comment gnrer les rapports.

Visualisation d'un tat dans une application windowsform


On doit commencer par crer une instance de notre tat crystal report. Dim rpt As New CrystalReport1 Maintenant voyons comment passer les donnes du dataset notre crystal report et comment le visualiser l'aide du viewer. rpt.SetDataSource(dsNorthwind1) CrystalReportViewer1.ReportSource = rpt CRviewer.Refresh() CrystalReportViewer1.Clear ()

52

VB NET

Accs aux donnes

Chapitre 11 : Gestion d'une exception d'accs concurrentiel


Vous allez crer une application Windows qui dclenche une erreur d'accs concurrentiel et illustre une stratgie de gestion de cette erreur. Vous allez simuler le travail de deux utilisateurs sur les mmes donnes au mme moment. Le Windows Form que vous allez crer vous permet de travailler en tant que l'un ou l'autre des deux utilisateurs depuis le mme formulaire. 1. L'utilisateur 1 et l'utilisateur 2 remplissent leurs groupes de donnes avec les mmes donnes. 2. L'utilisateur 2 modifie un enregistrement, met jour le groupe de donnes et crit les modifications dans la source de donnes. 3. L'utilisateur 1 modifie le mme enregistrement, modifie le groupe de donnes et tente d'crire les modifications dans la source de donnes. Ceci dclenche une erreur d'accs concurrentiel. Vous allez dtecter cette erreur, puis afficher les diffrentes versions de l'enregistrement, afin de permettre l'utilisateur de dterminer comment doivent tre traites les modifications en attente de l'utilisateur 1.

Cration d'un projet et d'une connexion de donnes


Pour crer un projet 1. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet pour afficher la bote de dialogue Nouveau projet. 2. Nommez le projet acces_concurrentiel, puis cliquez sur OK. Pour crer une connexion de donnes 1. Dans l'Explorateur de serveurs, crez une connexion l'exemple de base de donnes Pubs. 2. Dans l'Explorateur de serveurs, dveloppez la connexion que vous avez cre lors de l'tape prcdente. 3. Dveloppez la zone Tables. 4. Faites glisser la table authors vers votre formulaire. Un objet Connection et un objet DataAdapter apparaissent dans la barre des composants situe sous le formulaire.

Cration des groupes de donnes


Vous allez crer deux groupes de donnes appels DsAuthors1 et DsAuthors2. Ces groupes de donnes reprsenteront les donnes sur lesquelles les deux utilisateurs travaillent

53

VB NET

Accs aux donnes

simultanment. Vous ajouterez ensuite au formulaire deux contrles DataGrid que vous allez lier aux groupes de donnes. Enfin, deux contrles Button seront ajouts au formulaire : un bouton Mettre jour et un bouton Rtablir. Pour crer deux groupes de donnes 1. 2. 3. 4. Slectionnez l'objet DataAdapter. Dans le menu Donnes, slectionnez Gnrer un DataSet. Slectionnez Nouveau et attribuez au groupe de donnes le nom DsAuthors. partir de l'onglet Donnes de la Bote outils, faites glisser un DataSet jusqu'au formulaire. 5. Vrifiez que DataSet typ est slectionn et que acces_concurrentiel.DsAuthors apparat dans la zone Nom. Une instance appele DsAuthors2 apparat dans la barre d'tat des composants du concepteur.

Liaison des donnes et ajout des boutons


Pour ajouter deux DataGrids au formulaire 1. partir de l'onglet Windows Forms de la Bote outils, faites glisser un objet DataGrid jusqu'au ct gauche de votre formulaire. 2. partir de l'onglet Windows Forms de la Bote outils, faites glisser un objet DataGrid jusqu'au ct droit de votre formulaire. Pour lier les groupes de donnes aux contrles DataGrid 1. Slectionnez DataGrid1 et dfinissez les proprits suivantes dans la fentre Proprits : Proprit Valeur DataSource DsAuthors1 DataMember authors CaptionText DsAuthors1 2. Slectionnez DataGrid2 et dfinissez les proprits suivantes dans la fentre Proprits : Proprit Valeur DataSource DsAuthors2 DataMember Authors CaptionText DsAuthors2 Pour ajouter les boutons Mettre jour et Rtablir au formulaire

54

VB NET

Accs aux donnes

1. partir de l'onglet Windows Forms de la Bote outils, faites glisser un contrle Button jusqu'au formulaire et placez-le au-dessus de DataGrid1. 2. Slectionnez le bouton. Dans la fentre Proprits, nommez le bouton btnUpdate et dfinissez sa proprit Text sur Mettre jour. 3. partir de l'onglet Windows Forms de la Bote outils, faites glisser un second objet Button jusqu'au formulaire et placez-le au-dessus de DataGrid2. 4. Slectionnez le bouton. Dans la fentre Proprits, nommez le bouton btnReset et dfinissez sa proprit Text sur Rtablir.

Remplissage des groupes de donnes


Cette tape consiste remplir les deux groupes de donnes avec les mmes donnes. Pour ajouter le code permettant de remplir les groupes de donnes partir de la base de donnes Insrez le code suivant dans l'diteur de code :
Private Sub filltheDataSets() SqlDataAdapter1.Fill(DsAuthors1) SqlDataAdapter1.Fill(DsAuthors2) End Sub

Simulation des modifications de l'utilisateur 2


Pour ajouter le code permettant de simuler les modifications de l'utilisateur 2 Insrez le code suivant dans l'diteur de code :
Private Sub user2changes() DsAuthors2.authors(0).au_fname = "User 2" SqlDataAdapter1.Update(DsAuthors2.GetChanges()) SqlDataAdapter1.Fill(DsAuthors2) End Sub

Cration du gestionnaire d'vnements Form_Load


Pour ajouter dans l'vnement Form_Load le code permettant d'initialiser la procdure Double-cliquez sur une zone vide du formulaire pour crer automatiquement le gestionnaire d'vnements Form_Load. Ajoutez du code pour que le gestionnaire d'vnements ressemble ceci :
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load filltheDataSets() user2changes() End Sub

Enregistrez votre projet.

55

VB NET

Accs aux donnes

Excution de l'application
1. Appuyez sur F5 pour excuter l'application. Le formulaire apparat avec deux datagrids remplis avec les donnes de la table authors de la base de donnes Pubs. Le champ au_fname du premier enregistrement de DsAuthors1 doit tre John. Le champ au_fname du premier enregistrement de DsAuthors2 doit tre User 2. Votre formulaire devrait ressembler ceci :

2. Dans le menu Dboguer, cliquez sur Arrter le dbogage.

Mise jour du groupe de donnes et criture des modifications dans la base de donnes
Vous allez ensuite crire le code qui va tenter de mettre jour la base de donnes avec les modifications du groupe de donnes DsAuthors1. Pour mettre jour la base de donnes 1. Appelez la mthode Update. 2. Crez un gestionnaire d'exceptions qui affiche un message. Votre code doit se prsenter comme suit :
Private Sub updateDatabase() Try SqlDataAdapter1.Update(DsAuthors1.GetChanges) DsAuthors1.AcceptChanges()

56

VB NET

Accs aux donnes

MessageBox.Show("Mise jour effectue avec succs!") Catch ex As Exception MessageBox.Show(ex.Message, ex.GetType.ToString) End Try End Sub

Ensuite, vous allez ajouter le code qui modifie la colonne au_fname dans le groupe de donnes DsAuthors1. Le code appelle ensuite la procdure updateDatabase pour tenter d'crire cette modification dans la base de donnes. Comme cette valeur a dj t modifie par l'utilisateur 2, une erreur d'accs concurrentiel est dclenche. Pour mettre jour le groupe de donnes DsAuthors1 1. Double-cliquez sur le bouton Mettre jour. 2. Crez le gestionnaire d'vnements btnUpdate_Click :
Private Sub btnUpdate_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnUpdate.Click DsAuthors1.authors(0).au_fname = "User 1" updateDatabase() End Sub

3. Enregistrez votre projet. 4. Appuyez sur F5 pour excuter l'application. 5. Cliquez sur le bouton Mettre jour pour dfinir le champ au_fname du premier enregistrement sur User 1. L'erreur d'accs concurrentiel est dclenche.

Gestion des erreurs d'accs concurrentiel


La faon dont vous grez l'erreur dpend des rgles spcifiques votre entreprise, qui grent votre application. La stratgie de gestion d'erreur ci-dessous sera utilise comme illustration. L'application prsentera l'utilisateur trois versions de l'enregistrement :

L'enregistrement en cours dans la base de donnes L'enregistrement d'origine dans le groupe de donnes Les modifications proposes dans le groupe de donnes

L'utilisateur aura alors la possibilit d'crire les modifications proposes dans la base de donnes ou d'annuler la mise jour et d'actualiser le groupe de donnes.

Cration d'un gestionnaire d'erreurs personnalis


Lorsque vous effectuez une mise jour, il est souvent prfrable d'utiliser un gestionnaire d'exceptions structur qui vous permet de dtecter les erreurs. Dans le code que vous avez utilis plus haut, vous avez inclus un bloc try...catch qui dtecte toutes les erreurs c'est-dire une structure qui contient une instruction catch gnrique pour toutes les erreurs.

57

VB NET

Accs aux donnes

Vous pouvez galement dtecter des erreurs spcifiques de faon ragir de manire approprie. titre d'illustration, cette procdure va ajouter un gestionnaire d'exceptions pour une erreur spcifique, savoir une erreur d'accs concurrentiel que vous pouvez examiner en utilisant l'objet DbConcurrencyException. Vous allez grer cette erreur par l'affichage d'informations l'attention de l'utilisateur. Pour ajouter une gestion spcifique de l'erreur DBConcurrencyException 1. Si l'application est toujours en cours d'excution, quittez le mode excution pour revenir l'diteur de code. 2. Ajoutez une deuxime instruction catch au-dessus de l'instruction existante dans la mthode updateDatabase. 3. Passez l'objet DBConcurrencyException la procdure createMessage que vous allez crer dans la prochaine section.
Private Sub updateDatabase() Try SqlDataAdapter1.Update(DsAuthors1.GetChanges()) DsAuthors1.AcceptChanges() MessageBox.Show("Mise jour effectue avec succs!") Catch dbcx As DBConcurrencyException createMessage(dbcx) Catch ex As Exception MessageBox.Show(ex.Message, ex.GetType().ToString()) End Try End Sub

Affichage des choix pour l'utilisateur


Le code que vous venez de taper appelle la procdure createMessage qui va afficher les informations sur l'erreur pour l'utilisateur. Dans cette procdure, vous utiliserez une bote de message pour afficher les diffrentes versions de l'enregistrement pour l'utilisateur et lui permettre de choisir entre le remplacement de l'enregistrement avec les modifications et l'annulation des modifications. Pour crer la procdure createMessage Crez le gestionnaire d'erreurs en ajoutant le code ci-dessous dans l'diteur de code :
Private Sub createMessage(ByVal dbcx As DBConcurrencyException) Dim strInDs As String = "Enregistrement dorigine dans DsAuthors1:" _ & ControlChars.CrLf Dim strInDB As String = "Enregistrement Courant dans la base:" _ & ControlChars.CrLf Dim strProposed As String = "Modification propose:" & ControlChars.CrLf Dim strPromptText As String = "Voulez vous remplacez lenregistrement courant?" & ControlChars.CrLf Dim strMessage As String Dim reponse As System.Windows.Forms.DialogResult

58

VB NET

Accs aux donnes

Dim rowInDB As DataRow = _ DsAuthors2.authors.FindByau_id(CType(dbcx.Row("au_id"), String)) Dim i As Integer For i = 0 To dbcx.Row.ItemArray.Length - 1 strInDs &= dbcx.Row(i, DataRowVersion.Original) & _ ControlChars.Tab strInDB &= rowInDB(i, DataRowVersion.Current) & ControlChars.Tab strProposed &= dbcx.Row(i, DataRowVersion.Current) & _ ControlChars.Tab Next strMessage strMessage strMessage strMessage = strInDs & ControlChars.CrLf &= strInDB & ControlChars.CrLf &= strProposed & ControlChars.CrLf &= strPromptText

reponse = MessageBox.Show(strMessage, dbcx.Message, _ MessageBoxButtons.YesNo) processResponse(reponse) End Sub

Traitement de la rponse de l'utilisateur


Vous devrez galement ajouter du code pour le traitement de la rponse de l'utilisateur au message. Il pourra choisir de remplacer ou non l'enregistrement actuel de la base de donnes par la modification propose. Si l'utilisateur choisit d'effectuer le remplacement, la mthode Merge de DsAuthors1 est appele avec l'argument preserveChanges dfini sur true. Les versions d'origine des lignes de donnes de DsAuthors2 sont alors fusionnes avec les versions actuelles des lignes de donnes de DsAuthors1. La mise jour fonctionnera alors correctement car la version d'origine de l'enregistrement correspond dsormais la base de donnes. Pour traiter la rponse de l'utilisateur au message Ajoutez le code suivant dans l'diteur de code :
Private Sub processResponse(ByVal response As _ System.Windows.Forms.DialogResult) Select Case reponse Case System.Windows.Forms.DialogResult.Yes DsAuthors1.Merge(DsAuthors2, True) SqlDataAdapter1.Update(DsAuthors1) DsAuthors1.AcceptChanges() Case System.Windows.Forms.DialogResult.No DsAuthors1.Merge(DsAuthors2) End Select End Sub

59

VB NET

Accs aux donnes

Chapitre 12 : Gestion des transactions


A) Gestion des transactions au niveau SQL server
1) Les transactions locales
BEGIN TRANSACTION Indique le dbut d'une transaction locale explicite. L'instruction BEGIN TRANSACTION incrmente de 1 la variable @@TRANCOUNT. Syntaxe BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable [ WITH MARK [ 'description' ] ] ] Arguments transaction_name Nom attribu la transaction. transaction_name doit respecter les rgles applicables aux identificateurs, mais seuls les 32 premiers caractres de ce nom sont utiliss. Utilisez les noms de transaction seulement sur la paire la plus extrieure des instructions BEGIN...COMMIT ou BEGIN...ROLLBACK imbriques. @tran_name_variable Nom d'une variable dfinie par l'utilisateur et contenant un nom de transaction valide. La variable doit tre dclare avec un type de donnes char, varchar, nchar ou nvarchar. WITH MARK ['description'] Indique que la transaction est marque dans le journal. description est une chane qui dcrit la marque. Si WITH MARK est utilis, un nom de transaction doit tre spcifi. WITH MARK permet de restaurer un journal de transactions par rapport une marque nomme. Notes BEGIN TRANSACTION reprsente le point auquel les donnes rfrences par une connexion sont logiquement et physiquement cohrentes. Si des erreurs sont dtectes, toutes les modifications apportes aux donnes aprs l'excution de l'instruction BEGIN TRANSACTION peuvent tre annules afin que les donnes reviennent cet tat connu de cohrence. Une transaction se poursuit jusqu' ce qu'elle se termine sans erreur et que l'instruction COMMIT TRANSACTION soit mise pour que les modifications soient intgres de faon permanente la base de donnes ou bien jusqu' ce que des erreurs soient

60

VB NET

Accs aux donnes

rencontres, auquel cas les modifications sont effaces l'aide de l'instruction ROLLBACK TRANSACTION. Transactions marques L'option WITH MARK permet de placer le nom de la transaction dans le journal des transactions. Lors de la restauration d'une base de donnes dans un tat antrieur, la transaction marque peut tre utilise la place d'une date et d'une heure. L'instruction BEGIN TRAN new_name WITH MARK peut tre imbrique dans une transaction existante non marque. new_name devient alors le nom de marque de la transaction, malgr le nom ventuellement dj affect la transaction. Dans l'exemple suivant, M2 est le nom de la marque. BEGIN TRAN T1 UPDATE table1 ... BEGIN TRAN M2 WITH MARK UPDATE table2 ... SELECT * from table1 COMMIT TRAN M2 UPDATE table3 ... COMMIT TRAN T1 Si vous essayez de marquer une transaction dj marque, vous obtenez un message d'avertissement (non d'erreur) : BEGIN TRAN T1 WITH MARK UPDATE table1 ... BEGIN TRAN M2 WITH MARK Server: Msg 3920, Level 16, State 1, Line 3 WITH MARK option only applies to the first BEGIN TRAN WITH MARK. The option is ignored.

Autorisations
L'autorisation d'excuter l'instruction BEGIN TRANSACTION est attribue par dfaut tout utilisateur reconnu. COMMIT TRANSACTION Marque la fin d'une transaction russie. Si @@TRANCOUNT vaut 1, COMMIT TRANSACTION rend permanentes les modifications de donnes effectues dans la base de

61

VB NET

Accs aux donnes

donnes depuis le dbut de la transaction, libre les ressources utilises par la connexion et dcrmente @@TRANCOUNT 0. Si @@TRANCOUNT est suprieur 1, COMMIT TRANSACTION dcrmente @@TRANCOUNT seulement de 1. Syntaxe COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ] Arguments transaction_name Argument ignor par Microsoft SQL Server. Il est utilis pour faciliter la lecture par des programmeurs en indiquant quelle instruction BEGIN TRANSACTION imbrique l'instruction COMMIT TRANSACTION est associe. @tran_name_variable Nom d'une variable dfinie par l'utilisateur et contenant un nom de transaction valide. La variable doit tre dclare avec un type de donnes char, varchar, nchar ou nvarchar. Exemple A. Validation d'une transaction. L'exemple suivant augmente l'acompte vers un auteur lorsque les ventes d'un livre pour l'anne en cours sont suprieures 8000 FF. BEGIN TRANSACTION USE pubs GO UPDATE titles SET advance = advance * 1.25 WHERE ytd_sales > 8000 GO COMMIT GO B. Validation d'une transaction imbrique. L'exemple suivant cre une table, gnre trois niveaux de transactions imbriques, puis valide la transaction imbrique. Bien que chaque instruction COMMIT TRANSACTION ait un paramtre transaction_name, il n'existe aucune relation entre les instructions COMMIT TRANSACTION et BEGIN TRANSACTION. Les paramtres transaction_name aident simplement le programmeur s'assurer qu'un nombre suffisant de validations a t cod pour rduire @@TRANCOUNT 0, ce qui aura pour effet de valider la transaction externe.

62

VB NET

Accs aux donnes

CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3)) GO BEGIN TRANSACTION OuterTran -- @@TRANCOUNT set to 1. GO INSERT INTO TestTran VALUES (1, 'aaa') GO BEGIN TRANSACTION Inner1 -- @@TRANCOUNT set to 2. GO INSERT INTO TestTran VALUES (2, 'bbb') GO BEGIN TRANSACTION Inner2 -- @@TRANCOUNT set to 3. GO INSERT INTO TestTran VALUES (3, 'ccc') GO COMMIT TRANSACTION Inner2 -- Decrements @@TRANCOUNT to 2. -- Nothing committed. GO COMMIT TRANSACTION Inner1 -- Decrements @@TRANCOUNT to 1. -- Nothing committed. GO COMMIT TRANSACTION OuterTran -- Decrements @@TRANCOUNT to 0. -- Commits outer transaction OuterTran. GO ROLLBACK TRANSACTION Annule une transaction implicite ou explicite jusqu'au dbut de la transaction ou jusqu'au dernier point d'enregistrement l'intrieur de la transaction.

2) Les transactions distribues


Les transactions distribues sont rparties sur plusieurs serveurs nomms gestionnaires de ressources. La gestion de la transaction est coordonne entre les gestionnaires de ressources par un composant du serveur nomm gestionnaire de transactions Microsoft Distributed Transaction Coordinator (MS DTC). Une transaction excute sur un seul serveur SQL Server mais utilisant plusieurs bases de donnes est en ralit une transaction distribue. SQL Server, toutefois, gre la transaction distribue de manire interne ; elle apparat comme une transaction locale pour l'utilisateur.

63

VB NET

Accs aux donnes

Dans une application, une transaction distribue est gre de manire comparable une transaction locale. la fin de la transaction, l'application requiert que la transaction soit valide ou annule. La validation d'une transaction distribue doit tre gre de faon particulire par le gestionnaire de transaction pour minimiser les risques qu'une dfaillance du rseau entrane la validation de la transaction par certains gestionnaires de ressources, alors qu'elle sera annule par d'autres. Pour cela, le processus de validation est gr suivant deux phases (une phase de prparation et une phase de validation), et est connu sous le nom de validation deux phases (2PC). Phase de prparation Lorsque le gestionnaire de transaction reoit une requte de validation, il envoie une commande de prparation tous les gestionnaires de ressources impliqus dans la transaction. Chaque gestionnaire de ressources effectue alors toutes les oprations ncessaires l'enregistrement de la transaction, et tous les tampons contenant les images du journal de la transaction sont vids sur le disque. Lorsque chaque gestionnaire de ressources a termin la phase de prparation, il renvoie un message de succs ou d'chec au gestionnaire de transactions. Phase de validation Si le gestionnaire de transactions reoit des messages de prparation russie de tous les gestionnaires de ressources, il envoie une commande de validation chacun d'entre eux. Les gestionnaires de ressources peuvent alors effectuer la validation. Si tous les gestionnaires de ressources indiquent le succs de la validation, le gestionnaire de transactions envoie alors une notification de succs l'application. Si l'un des gestionnaires de ressources indique un chec de la prparation, le gestionnaire de transactions envoie une commande d'annulation chaque gestionnaire de ressources et notifie l'chec de la validation l'application. BEGIN DISTRIBUTED TRANSACTION Indique le dbut d'une transaction Transact-SQL distribue gre par MS DTC (Microsoft Distributed Transaction Coordinator).

Syntaxe
BEGIN DISTRIBUTED TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] Le serveur excutant l'instruction BEGIN DISTRIBUTED TRANSACTION est le crateur de la transaction et c'est aussi lui qui contrle l'excution jusqu' son terme. Si une instruction COMMIT TRANSACTION ou ROLLBACK TRANSACTION est ensuite mise pour la connexion, le serveur de contrle demande MS DTC de grer l'excution de la transaction distribue sur tous les serveurs concerns. Deux mthodes permettent d'inscrire des serveurs SQL distants dans une transaction distribue :
64

VB NET

Accs aux donnes

Une connexion dj inscrite dans la transaction distribue effectue un appel de procdure distante faisant rfrence un serveur distant. Une connexion dj inscrite dans la transaction distribue excute une requte distribue faisant rfrence un serveur distant.

Par exemple, si l'instruction BEGIN DISTRIBUTED TRANSACTION est mise sur un ServerA, la connexion appelle une procdure stocke sur un ServerB et une autre sur un ServerC, et la procdure stocke sur le ServerC excute une requte distribue sur un ServerD, la suite de quoi les quatre serveurs SQL se retrouvent inscrits dans la transaction distribue. ServerA est le serveur qui cre la transaction et contrle son excution. Les connexions intervenant dans les transactions Transact-SQL distribues n'obtiennent pas d'objet de transaction qu'elles peuvent transmettre une autre connexion pour que celle-ci soit explicitement inscrite dans la transaction distribue. La seule faon pour un serveur distant de s'inscrire dans une transaction est d'tre la cible d'un appel de procdure stocke distante ou d'une requte distribue. Exemple Dans l'exemple suivant, le nom de l'auteur est mis jour dans les bases de donnes locales et distantes. Ces bases vont soit valider soit annuler la transaction. Remarque Cet exemple provoque un message d'erreur, sauf si MS DTC est actuellement install sur l'ordinateur excutant SQL Server. Pour plus d'informations sur l'installation de MS DTC, voir la documentation Microsoft Distributed Transaction Coordinator. USE pubs GO BEGIN DISTRIBUTED TRANSACTION UPDATE authors SET au_lname = 'McDonald' WHERE au_id = '409-56-7008' EXECUTE remote.pubs.dbo.changeauth_lname '409-567008','McDonald' COMMIT TRAN GO

Le service MS DTC
Microsoft Distributed Transaction Coordinator (MS DTC) est un gestionnaire de transactions qui permet aux applications clientes d'inclure plusieurs sources de donnes diffrentes dans une seule transaction. MS DTC coordonne la validation de la transaction distribue au travers de tous les serveurs inscrits dans la transaction.

65

VB NET

Accs aux donnes

Une installation Microsoft SQL Server peut participer une transaction distribue en :

Appelant des procdures stockes sur des serveurs distants excutant SQL Server. Transformant automatiquement ou explicitement la transaction locale en une transaction distribue et en inscrivant les serveurs distants dans la transaction. Effectuant des mises jour distribues qui mettent jour les donnes sur plusieurs sources de donnes OLE DB. Si ces sources de donnes OLE DB prennent en charge l'interface de transaction distribue OLE DB, SQL Server peut galement les inscrire dans une transaction distribue.

MS DTC est le service qui coordonne l'achvement des transactions distribues afin de s'assurer que toutes les mises jour prsentes sur tous les serveurs sont, soit permanentes, soit supprimes en cas d'erreurs.

Les applications SQL Server peuvent galement appeler MS DTC directement afin de dmarrer explicitement une transaction distribue. Un ou plusieurs serveurs excutant SQL

66

VB NET

Accs aux donnes

Server peuvent ensuite tre contraints s'inscrire dans la transaction distribue et coordonner l'achvement de cette dernire avec MSDTC.

B) Excution d'une transaction l'aide de ADO.NET


Vous pouvez commencer, valider ou annuler une transaction en utilisant les objets Connection et Transaction. Appelez la mthode BeginTransaction de l'objet Connection pour marquer le dbut de la transaction. La mthode BeginTransaction retourne une rfrence la transaction. Cette rfrence est affecte aux objets Command inscrits dans la transaction. Assignez l'objet Transaction la proprit Transaction de la commande excuter. Si la commande est excute sur une connexion avec une transaction active et si l'objet Transaction n'a pas t assign la proprit Transaction de la commande, une exception est leve. Excutez ensuite les commandes requises. Appelez la mthode Commit de l'objet Transaction pour terminer la transaction ou la mthode Rollback pour l'annuler. L'exemple de code suivant illustre la logique transactionnelle utilisant ADO.NET avec SQL Server. Dim cn As SqlConnection = New SqlConnection("Data Source=(LOCAL);Initial Catalog=Northwind;Integrated Security=SSPI;") cn.Open() Debut de la tansaction Dim trs As SqlTransaction = cn.BeginTransaction() ' Ajout dune commande une transaction. Dim cmd As SqlCommand = cn.CreateCommand() cmd.Transaction = trs

67

VB NET

Accs aux donnes

Try cmd.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')" cmd.ExecuteNonQuery() cmd.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')" cmd.ExecuteNonQuery() cmd.Commit() msgbox("les deux enregistrements ont t valids.") Catch e As Exception Try trs.Rollback() Catch ex As SqlException If Not trs.Connection Is Nothing Then msgbox("Une exception de type " & ex.GetType().ToString() & _ " a t leve au cours de lannulation de la transaction.") End If End Try msgbox("Une exception de type " & e.GetType().ToString() & _ " a t leve au cours de la validation de la transaction." & "Aucun enregsitrement na t enregistr.") Finally cn.Close() End Try

Inscription dans une transaction distribue


L'objet Connection s'inscrit automatiquement dans une transaction distribue existante s'il dtermine qu'une transaction est active. L'inscription automatique dans une transaction se produit lorsque la connexion est ouverte. Vous pouvez dsactiver l'inscription automatique dans des transactions existantes en spcifiant Enlist=false comme paramtre de chane de connexion pour un SqlConnection ou OLE DB Services=-7 pour un OleDbConnection. Si l'inscription automatique est dsactive, vous pouvez vous inscrire dans une transaction distribue existante l'aide de la mthode EnlistDistributedTransaction de l'objet Connection. L'inscription dans une transaction distribue existante garantit que si la transaction vient tre annule ou valide, les modifications apportes par le code dans la source de donnes seront elles aussi valides ou annules. EnlistDistributedTransaction est particulirement applicable lors du regroupement d'objets mtier. Si un objet mtier est regroup avec une connexion ouverte, l'inscription automatique dans la transaction se produit lorsque cette connexion est ouverte et tire du pool. Si plusieurs transactions sont effectues l'aide de l'objet mtier regroup, la connexion ouverte pour cet objet n'est pas automatiquement inscrite dans les nouvelles transactions lances. Dans ce cas, vous pouvez dsactiver l'inscription automatique dans la transaction pour Connection et l'inscrire dans les transactions l'aide de EnlistDistributedTransaction. EnlistDistributedTransaction accepte un unique argument de type ITransaction qui est une rfrence la transaction existante. Aprs avoir appel Connection.EnlistDistributedTransaction, toutes les modifications apportes la source de donnes l'aide de Connection sont incluses dans la transaction.

68

VB NET

Accs aux donnes

Remarque Le Connection doit tre ouvert avant l'appel EnlistDistributedTransaction. ATTENTION EnlistDistributedTransaction retourne une Exception si le Connection a dj commenc une transaction au moyen de BeginTransaction. Toutefois, si la transaction est une transaction locale dmarre dans la source de donnes (par exemple, l'excution explicite de l'instruction BEGIN TRANSACTION l'aide de SqlCommand), EnlistDistributedTransaction annule la transaction locale et s'inscrit dans la transaction distribue existante requise. Vous ne recevez pas d'avis d'annulation de la transaction locale et devez grer toutes les transactions locales qui n'ont pas t dmarres l'aide de BeginTransaction.

69