Elle se manipule avec les mêmes méthodes que DataTableCollection.
Méthode Add
Surchargée. Comme d'habitude vous pouvez soit créer une relation puis l'ajouter à la collection, soit utiliser une des syntaxes surchargées de création directe.
Public Function Add(ByVal name As String, ByVal parentColumns() As DataColumn, ByVal
childColumns() As DataColumn, ByVal createConstraints As Boolean) As DataRelation
Le nom est facultatif.
CreateConstraint permet de créer implicitement la contrainte de clé étrangère sur la table enfant. ParentColumn et ChildColumn peuvent être soit un tableau de DataColumn, soit un seul DataColumn.
U
Propriétés de DataRelation
ChildColumns (DataColumn())
Renvoie un tableau d'objet DataColumn (ou un seul DataColumn) composant la clé étrangère de la table enfant.
ChildKeyConstraint (ForeignKeyConstraint)
Renvoie l'objet ForeignKeyConstraint de la relation.ChildTable (DataTable)
Renvoie la table enfant.ParentColumns, ParentTable, ParentKeyConstraint
Fonctionne comme les propriétés précédentes pour les objets parents. Dans le cas de ParentKeyConstraint c'est un objet UniqueConstraint qui est renvoyé.
Nested (Booléen)
Renvoie vrai si les objets DataRelation sont imbriqués. Cette propriété est utilisée lorsqu'on écrit un fichier XML ou pour synchroniser un XMLDataDocument avec le Dataset.
<CustomerOrders> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> </Customers> <Customers> <CustomerID>ANATR</CustomerID>
<CompanyName>Ana Trujillo Emparedados y helados</CompanyName> </Customers> <Orders> <OrderID>10643</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-08-25T00:00:00</OrderDate> </Orders> <Orders> <OrderID>10692</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-10-03T00:00:00</OrderDate> </Orders> <Orders> <OrderID>10308</OrderID> <CustomerID>ANATR</CustomerID> <OrderDate>1996-09-18T00:00:00</OrderDate> </Orders> </CustomerOrders>
Notez que l'élément Customers et les éléments Orders sont représentés en tant qu'éléments frères. Si vous souhaitiez que les éléments Orders apparaissent comme les enfants de leurs éléments parents respectifs, il vous faudrait assigner la valeur true à la propriété Nested du DataRelation.
Le code suivant montre la sortie que vous obtiendriez, avec les éléments Orders imbriqués dans leurs éléments parents respectifs.
<CustomerOrders> <Customers> <CustomerID>ALFKI</CustomerID> <Orders> <OrderID>10643</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-08-25T00:00:00</OrderDate> </Orders> <Orders> <OrderID>10692</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-10-03T00:00:00</OrderDate> </Orders> <CompanyName>Alfreds Futterkiste</CompanyName> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <Orders> <OrderID>10308</OrderID> <CustomerID>ANATR</CustomerID> <OrderDate>1996-09-18T00:00:00</OrderDate> </Orders>
<CompanyName>Ana Trujillo Emparedados y helados</CompanyName> </Customers>
Les classes DataView & DataViewManager
Jusque là, je ne vous ai pas tellement parlé de navigation dans les données ni de contrôles dépendants. Beaucoup de développeurs ADO sont pourtant perturbés par la disparition des méthodes de navigation de l'objet Recordset. Si ces méthodes avaient un sens dans un recordset qui gère une position courante, elle n'en a plus dans un Dataset qui est un ensemble de collections. En effet, la ligne en cours d'une collection n'est jamais qu'une position ordinale et naviguer dans une collection ne revient qu'à modifier celle-ci.
Les objets DataView sont une couche entre les objets DataTable et l'interface utilisateur. Elles permettent de présenter la table sous-jacente comme on veut. Une table peut exposer plusieurs vues d'elle- même. Un DataView est lié dynamiquement à la table, ce qui veut dire qu'il reflète les données et les changements apportés à la table.
Il ne faut pas confondre un DataView et une vue au sens SQL du terme. Un DataView ne peut exposer que des données provenant d'une seule table, ne peut pas créer de colonne de calcul et ne peut pas restreindre les colonnes affichées.
Un DataViewManager permet de gérer les paramètres des vues de toutes les tables au niveau du Dataset. En lui-même il ne fait rien de bien particulier si ce n'est permettre d'afficher des données connexes dans des contrôles dépendants.
Je vous parlais un peu plus avant de navigation dans le jeu d'enregistrement.
La navigation au sens ADO du terme se gère par l'intermédiaire du DataBinding. Non parce que ce n'est pas possible de faire autrement pour naviguer dans les enregistrements, mais parce que c'est la méthode pour pouvoir lier à la conception des contrôles dépendants gérant la navigation. La navigation dans une collection ne pose aucun problème. Regardons le code suivant :
Private MaTable As New Data.DataTable Private MaLigne As Data.DataRowView Private monIndex As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strConn, strSQL As String
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\tutoriel\biblio.mdb;"
strSQL = "SELECT * FROM Authors"
Dim MonDAPublisher As New Data.OleDb.OleDbDataAdapter(strSQL, strConn)
Dim MonDataset As New DataSet("Pubs") MonDAPublisher.Fill(MonDataset, "Auteurs") MaTable = MonDataset.Tables(0)
maTable.Constraints.Add("pk1", maTable.Columns(0), True) monIndex = 0
Call Affiche_Donnee() End Sub
Private Sub Btn_Del_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Del.Click
MaTable.Rows.RemoveAt(monIndex) End Sub
Private Sub cmdFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFirst.Click
monIndex = 0
Call Affiche_Donnee() End Sub
Private Sub Affiche_Donnee()
MaLigne = MaTable.DefaultView.Item(monIndex) Me.TextBox1.Text = MaLigne.Item(0)
Me.TextBox2.Text = MaLigne.Item(1) Me.TextBox3.Text = MaLigne.Item(2) & "" End Sub
Private Sub cmdNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNext.Click
monIndex += 1
Call Affiche_Donnee() End Sub
Private Sub cmdPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPrev.Click
monIndex -= 1
Call Affiche_Donnee() End Sub
Private Sub cmdLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLast.Click
monIndex = MaTable.DefaultView.Count - 1 Call Affiche_Donnee()
End Sub
Vous verrez que le code fonctionne très bien même si je retire des lignes de la table. Cela vient du fait que le DataView gère toujours correctement ces index.
U