Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
VB NET
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
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
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.
VB NET
VB NET
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()
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
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
VB NET
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
10
VB NET
11
VB NET
12
VB NET
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.
13
VB NET
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
15
VB NET
16
VB NET
17
VB NET
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.
18
VB NET
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.
19
VB NET
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
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.
21
VB NET
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.
VB NET
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.
23
VB NET
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.
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
25
VB NET
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.
26
VB NET
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
le contrle de grille de donnes sera rempli automatiquement par les seuls clients du pays slectionn.
28
VB NET
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
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
30
VB NET
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
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
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
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
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.
35
VB NET
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
"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
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
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.
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)
VB NET
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
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
40
VB NET
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.
3. Dans la bote outils, cliquez sur l'onglet Windows Forms puis double-cliquez sur Timer.
41
VB NET
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
42
VB NET
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
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
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.
44
VB NET
45
VB NET
End Get Set(ByVal Value as Boolean) blnAlarmSet = Value End Set End Property
46
VB NET
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
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
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
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
51
VB NET
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.
52
VB NET
53
VB NET
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.
54
VB NET
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.
55
VB NET
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 :
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
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.
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.
57
VB NET
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
58
VB NET
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
59
VB NET
60
VB NET
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
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
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.
63
VB NET
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
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
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
Server peuvent ensuite tre contraints s'inscrire dans la transaction distribue et coordonner l'achvement de cette dernire avec MSDTC.
67
VB NET
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
68
VB NET
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