Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
par Scott Mitchell
Les TableAdapters au sein d’un DataSet typé prennent automatiquement soin de se connecter à la base de données, d’émettre des commandes et de remplir un DataTable avec les résultats. Toutefois, il existe des occasions de prendre soin de ces détails nous-mêmes, et dans ce tutoriel, nous apprenons à accéder aux paramètres de connexion de base de données et de niveau commande dans TableAdapter.
Présentation
Tout au long de la série de tutoriels, nous avons utilisé des DataSets typés pour implémenter la couche d’accès aux données et les objets métier de notre architecture en couches. Comme indiqué dans le premier tutoriel, les DataTables de Typed DataSet servent de référentiels de données, tandis que les TableAdapters agissent en tant que wrappers pour communiquer avec la base de données pour récupérer et modifier les données sous-jacentes. Les TableAdapters encapsulent la complexité impliquée dans l’utilisation de la base de données et nous évitent d'avoir à écrire du code pour nous connecter à la base de données, émettre une commande ou remplir une DataTable avec les résultats.
Toutefois, il existe des moments où nous devons entrer dans les profondeurs de TableAdapter et écrire du code qui fonctionne directement avec les objets ADO.NET. Dans le didacticiel Encapsuler les modifications de la base de données dans une transaction, par exemple, nous avons ajouté des méthodes à TableAdapter pour commencer, valider et annuler les transactions ADO.NET. Ces méthodes ont utilisé un objet interne créé manuellement SqlTransaction
qui a été affecté aux objets SqlCommand
de TableAdapter.
Dans ce tutoriel, nous allons examiner comment accéder aux paramètres de connexion de base de données et de niveau commande dans TableAdapter. En particulier, nous allons ajouter des fonctionnalités au ProductsTableAdapter
permettant l’accès aux paramètres de chaîne de connexion sous-jacente et de délai d’expiration des commandes.
Utilisation de données à l’aide de ADO.NET
Microsoft .NET Framework contient une multitude de classes conçues spécifiquement pour fonctionner avec des données. Ces classes, situées dans l'espace de nomsSystem.Data
, sont connues sous le nom de classes ADO.NET. Certaines des classes sous l’ADO.NET parapluie sont liées à un fournisseur de données particulier. Vous pouvez considérer un fournisseur de données comme un canal de communication qui permet aux informations de circuler entre les classes ADO.NET et le magasin de données sous-jacent. Il existe des fournisseurs généralisés, comme OleDb et ODBC, ainsi que des fournisseurs spécialement conçus pour un système de base de données particulier. Par exemple, s’il est possible de se connecter à une base de données Microsoft SQL Server à l’aide du fournisseur OleDb, le fournisseur SqlClient est beaucoup plus efficace, car il a été conçu et optimisé spécifiquement pour SQL Server.
Lorsque vous accédez par programmation aux données, le modèle suivant est couramment utilisé :
- Établissez une connexion à la base de données.
- Émettez une commande.
- Lors de l'utilisation de
SELECT
pour les requêtes, travaillez avec les enregistrements qui en résultent.
Il existe des classes ADO.NET distinctes pour effectuer chacune de ces étapes. Pour vous connecter à une base de données à l’aide du fournisseur SqlClient, par exemple, utilisez la SqlConnection
classe. Pour émettre une commande de type INSERT
, UPDATE
, DELETE
ou SELECT
à la base de données, utilisez la classe SqlCommand
.
À l’exception des modifications apportées à la base de données encapsulées dans un didacticiel transactionnel , nous n’avons pas dû écrire de code ADO.NET de bas niveau, car le code généré automatiquement par TableAdapters inclut les fonctionnalités nécessaires pour se connecter à la base de données, émettre des commandes, récupérer des données et remplir ces données dans DataTables. Toutefois, il peut arriver que nous devons personnaliser ces paramètres de bas niveau. Au cours des prochaines étapes, nous allons examiner comment exploiter les objets ADO.NET utilisés en interne par les TableAdapters.
Étape 1 : Examen avec la propriété Connection
Chaque classe TableAdapter a une Connection
propriété qui spécifie les informations de connexion de base de données. Ce type de données et la valeur ConnectionString
de cette propriété sont déterminés par les sélections effectuées dans l'assistant de configuration TableAdapter. Souvenez-vous que lorsque nous ajoutons au départ un TableAdapter à un jeu de données typé, cet assistant nous demande la source de la base de données (voir la figure 1). La liste déroulante de cette première étape inclut les bases de données spécifiées dans le fichier de configuration, ainsi que toutes les autres bases de données dans les connexions de données de l’Explorateur de serveurs. Si la base de données que nous voulons utiliser n’existe pas dans la liste déroulante, une nouvelle connexion de base de données peut être spécifiée en cliquant sur le bouton Nouvelle connexion et en fournissant les informations de connexion nécessaires.
Figure 1 : La première étape de l’Assistant Configuration de TableAdapter (cliquez pour afficher l’image de taille complète)
Prenons un moment pour inspecter le code de la propriété TableAdapter Connection
. Comme indiqué dans le didacticiel Création d’une couche d’accès aux données , nous pouvons afficher le code TableAdapter généré automatiquement en accédant à la fenêtre Affichage de classes, en explorant la classe appropriée, puis en double-cliquant sur le nom du membre.
Accédez à la fenêtre Affichage de classe en accédant au menu Affichage et en choisissant Affichage de classe (ou en tapant Ctrl+Maj+C). Dans la moitié supérieure de la fenêtre Affichage de classes, accédez à l’espace NorthwindTableAdapters
de noms et sélectionnez la ProductsTableAdapter
classe. Cela affichera les membres de ProductsTableAdapter
dans la moitié inférieure de la vue de classe, comme illustré sur la figure 2. Double-cliquez sur la Connection
propriété pour afficher son code.
Figure 2 : Double-Click la propriété de connexion dans la vue de classe pour afficher son code généré automatiquement
La propriété tableAdapter Connection
et d’autres codes liés à la connexion sont les suivants :
Private _connection As System.Data.SqlClient.SqlConnection
Private Sub InitConnection()
Me._connection = New System.Data.SqlClient.SqlConnection
Me._connection.ConnectionString = _
ConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
End Sub
Friend Property Connection() As System.Data.SqlClient.SqlConnection
Get
If (Me._connection Is Nothing) Then
Me.InitConnection
End If
Return Me._connection
End Get
Set
Me._connection = value
If (Not (Me.Adapter.InsertCommand) Is Nothing) Then
Me.Adapter.InsertCommand.Connection = value
End If
If (Not (Me.Adapter.DeleteCommand) Is Nothing) Then
Me.Adapter.DeleteCommand.Connection = value
End If
If (Not (Me.Adapter.UpdateCommand) Is Nothing) Then
Me.Adapter.UpdateCommand.Connection = value
End If
Dim i As Integer = 0
Do While (i < Me.CommandCollection.Length)
If (Not (Me.CommandCollection(i)) Is Nothing) Then
CType(Me.CommandCollection(i), _
System.Data.SqlClient.SqlCommand).Connection = value
End If
i = (i + 1)
Loop
End Set
End Property
Lorsque la classe TableAdapter est instanciée, la variable _connection
membre est égale à Nothing
. Lorsque la Connection
propriété est accessible, elle vérifie d’abord si la _connection
variable membre a été instanciée. Si ce n’est pas le cas, la InitConnection
méthode est appelée, qui instancie _connection
et définit sa ConnectionString
propriété sur la valeur de chaîne de connexion spécifiée à partir de la première étape de l’Assistant Configuration TableAdapter.
La Connection
propriété peut également être affectée à un SqlConnection
objet. Cela associe le nouvel SqlConnection
objet à chacun des objets TableAdapter SqlCommand
.
Étape 2 : Exposition des paramètres de Connection-Level
Les informations de connexion doivent rester encapsulées dans TableAdapter et ne pas être accessibles aux autres couches de l’architecture de l’application. Toutefois, il peut arriver que les informations au niveau de la connexion de TableAdapter soient accessibles ou personnalisables pour une requête, un utilisateur ou une page ASP.NET.
Étendons le ProductsTableAdapter
Northwind
DataSet pour inclure une ConnectionString
propriété qui peut être utilisée par la couche de logique métier pour lire ou modifier la chaîne de connexion utilisée par le TableAdapter.
Remarque
Une chaîne de connexion est une chaîne qui spécifie les informations de connexion de base de données, telles que le fournisseur à utiliser, l’emplacement de la base de données, les informations d’identification d’authentification et d’autres paramètres liés à la base de données. Pour obtenir la liste des modèles de chaîne de connexion utilisés par divers magasins de données et fournisseurs, consultez ConnectionStrings.com.
Comme indiqué dans le didacticiel Création d’une couche d’accès aux données , les classes générées automatiquement par l’ensemble de données typés peuvent être étendues à l’aide de classes partielles. Tout d’abord, créez un sous-dossier dans le projet nommé ConnectionAndCommandSettings
sous le ~/App_Code/DAL
dossier.
Figure 3 : Ajouter un sous-dossier nommé ConnectionAndCommandSettings
Ajoutez un nouveau fichier de classe nommé ProductsTableAdapter.ConnectionAndCommandSettings.vb
et entrez le code suivant :
Namespace NorthwindTableAdapters
Partial Public Class ProductsTableAdapter
Public Property ConnectionString() As String
Get
Return Me.Connection.ConnectionString
End Get
Set(ByVal value As String)
Me.Connection.ConnectionString = value
End Set
End Property
End Class
End Namespace
Cette classe partielle ajoute une Public
propriété nommée ConnectionString
à la ProductsTableAdapter
classe qui permet à n’importe quelle couche de lire ou de mettre à jour la chaîne de connexion pour la connexion sous-jacente de TableAdapter.
Avec cette classe partielle créée (et enregistrée), ouvrez la ProductsBLL
classe. Accédez à l’une des méthodes existantes et tapez Adapter
, puis appuyez sur la touche point pour afficher IntelliSense. Vous devez voir la nouvelle ConnectionString
propriété disponible dans IntelliSense, ce qui signifie que vous pouvez lire ou ajuster cette valeur par programmation à partir de la BLL.
Exposition de l’objet de connexion entier
Cette classe partielle expose une seule propriété de l’objet de connexion sous-jacent : ConnectionString
. Si vous souhaitez rendre l’objet de connexion complet disponible au-delà des limites de TableAdapter, vous pouvez également modifier le Connection
niveau de protection des propriétés. Le code généré automatiquement que nous avons examiné à l’étape 1 a montré que la propriété TableAdapter Connection
est marquée comme Friend
, ce qui signifie qu’elle ne peut être accessible que par des classes dans la même assemblée. Cela peut toutefois être modifié via la propriété TableAdapter ConnectionModifier
.
Ouvrez le Northwind
DataSet, cliquez sur le ProductsTableAdapter
dans le Concepteur, puis accédez à la fenêtre Propriétés. Là, vous verrez que ConnectionModifier
est défini sur sa valeur par défaut, Assembly
. Pour rendre la Connection
propriété disponible en dehors de l’assembly Typed DataSet, remplacez la propriété ConnectionModifier
par Public
.
Figure 4 : Le Connection
niveau d’accessibilité de la propriété peut être configuré via la ConnectionModifier
propriété (Cliquez pour afficher l’image de taille complète)
Enregistrez le DataSet, puis revenez à la ProductsBLL
classe. Comme précédemment, accédez à l’une des méthodes existantes et tapez Adapter
, puis appuyez sur la touche de point pour afficher IntelliSense. La liste doit inclure une Connection
propriété, ce qui signifie que vous pouvez désormais lire ou affecter des paramètres au niveau de la connexion à partir de la BLL.
Étape 3 : Examen des propriétés Command-Related
Un TableAdapter se compose d'une requête principale qui, par défaut, a généré automatiquement des instructions INSERT
, UPDATE
, et DELETE
. Cette requête principale INSERT
, les instructions UPDATE
, et DELETE
sont implémentées dans le code du TableAdapter en tant qu'objet adaptateur de données ADO.NET via la propriété Adapter
. Comme avec sa Connection
propriété, le type de données de la Adapter
propriété est déterminé par le fournisseur de données utilisé. Étant donné que ces didacticiels utilisent le fournisseur SqlClient, la Adapter
propriété est de type SqlDataAdapter
.
La propriété TableAdapter a trois propriétés de type Adapter
qu’elle utilise pour émettre les instructions SqlCommand
, INSERT
, et UPDATE
.
InsertCommand
UpdateCommand
DeleteCommand
Un SqlCommand
objet est chargé d’envoyer une requête particulière à la base de données et a des propriétés telles que : CommandText
, qui contient l’instruction SQL ad hoc ou la procédure stockée à exécuter ; et Parameters
, qui est une collection d’objets SqlParameter
. Comme nous l’avons vu dans le didacticiel Création d’une couche d’accès aux données , ces objets de commande peuvent être personnalisés via la fenêtre Propriétés.
Outre sa requête principale, TableAdapter peut inclure un nombre variable de méthodes qui, lorsqu’elles sont appelées, distribuent une commande spécifiée à la base de données. L’objet de commande de la requête principale et les objets de commande pour toutes les méthodes supplémentaires sont stockés dans la propriété TableAdapter CommandCollection
.
Prenons un moment pour examiner le code généré par le ProductsTableAdapter
dans le Northwind
DataSet pour ces deux propriétés ainsi que leurs variables membres d'assistance et méthodes auxiliaires.
Private WithEvents _adapter As System.Data.SqlClient.SqlDataAdapter
Private Sub InitAdapter()
Me._adapter = New System.Data.SqlClient.SqlDataAdapter
... Code that creates the InsertCommand, UpdateCommand, ...
... and DeleteCommand instances - omitted for brevity ...
End Sub
Private ReadOnly Property Adapter() As System.Data.SqlClient.SqlDataAdapter
Get
If (Me._adapter Is Nothing) Then
Me.InitAdapter
End If
Return Me._adapter
End Get
End Property
Private _commandCollection() As System.Data.SqlClient.SqlCommand
Private Sub InitCommandCollection()
Me._commandCollection = New System.Data.SqlClient.SqlCommand(8) {}
... Code that creates the command objects for the main query and the ...
... ProductsTableAdapter�s other eight methods - omitted for brevity ...
End Sub
Protected ReadOnly Property CommandCollection() As System.Data.SqlClient.SqlCommand()
Get
If (Me._commandCollection Is Nothing) Then
Me.InitCommandCollection
End If
Return Me._commandCollection
End Get
End Property
Le code pour les propriétés Adapter
et CommandCollection
imite étroitement celui de la propriété Connection
. Il existe des variables membres qui contiennent les objets utilisés par les propriétés. Les accesseurs de propriétés Get
commencent par vérifier si la variable membre correspondante est Nothing
. Si c’est le cas, une méthode d’initialisation est appelée qui crée une instance de la variable membre et affecte les propriétés de commande principales.
Étape 4 : Exposition des paramètres de Command-Level
Dans l’idéal, les informations au niveau de la commande doivent rester encapsulées dans la couche d’accès aux données. Si ces informations doivent être nécessaires dans d’autres couches de l’architecture, toutefois, elles peuvent être exposées par le biais d’une classe partielle, comme avec les paramètres au niveau de la connexion.
Étant donné que TableAdapter n’a qu’une seule Connection
propriété, le code permettant d’exposer les paramètres au niveau de la connexion est assez simple. Les choses sont un peu plus compliquées lors de la modification des paramètres au niveau de la commande, car TableAdapter peut avoir plusieurs objets de commande - un InsertCommand
, UpdateCommand
et , ainsi DeleteCommand
qu’un nombre variable d’objets de commande dans la CommandCollection
propriété. Lors de la mise à jour des paramètres au niveau de la commande, ces paramètres doivent être propagés à tous les objets de commande.
Par exemple, imaginez qu’il y avait certaines requêtes dans TableAdapter qui ont pris un temps extraordinaire pour s’exécuter. Lorsque vous utilisez TableAdapter pour exécuter l’une de ces requêtes, nous pouvons augmenter la propriété de l’objet CommandTimeout
de commande. Cette propriété spécifie le nombre de secondes à attendre l’exécution de la commande et la valeur par défaut est 30.
Pour permettre à la propriété CommandTimeout
d’être ajustée par la BLL, ajoutez la méthode suivante Public
à la classe partielle en utilisant le fichier créé à l’étape ProductsDataTable
(ProductsTableAdapter.ConnectionAndCommandSettings.vb
) :
Public Sub SetCommandTimeout(ByVal timeout As Integer)
If Me.Adapter.InsertCommand IsNot Nothing Then
Me.Adapter.InsertCommand.CommandTimeout = timeout
End If
If Me.Adapter.DeleteCommand IsNot Nothing Then
Me.Adapter.DeleteCommand.CommandTimeout = timeout
End If
If Me.Adapter.UpdateCommand IsNot Nothing Then
Me.Adapter.UpdateCommand.CommandTimeout = timeout
End If
For i As Integer = 0 To Me.CommandCollection.Length - 1
If Me.CommandCollection(i) IsNot Nothing Then
Me.CommandCollection(i).CommandTimeout = timeout
End If
Next
End Sub
Cette méthode peut être appelée à partir de la couche BLL ou Presentation pour définir le délai d’expiration des commandes pour tous les problèmes de commande par cette instance TableAdapter.
Remarque
Les propriétés Adapter
et CommandCollection
sont marquées comme Private
, ce qui signifie qu’elles ne peuvent être accessibles qu’à partir du code dans le TableAdapter. Contrairement à la Connection
propriété, ces modificateurs d’accès ne sont pas configurables. Par conséquent, si vous devez exposer des propriétés au niveau de la commande à d’autres couches de l’architecture, vous devez utiliser l’approche de classe partielle décrite ci-dessus pour fournir une méthode ou une Public
propriété qui lit ou écrit dans les Private
objets de commande.
Résumé
Les TableAdapters au sein d’un Jeu de données typé servent à encapsuler les détails et la complexité de l’accès aux données. À l’aide de TableAdapters, nous n’avons pas à nous soucier de l’écriture de ADO.NET code pour vous connecter à la base de données, émettre une commande ou remplir les résultats dans un DataTable. Tout est géré automatiquement pour nous.
Toutefois, il peut arriver que nous devons personnaliser les ADO.NET spécifiques de bas niveau, telles que la modification de la chaîne de connexion ou des valeurs de délai d’expiration de commande ou de connexion par défaut. TableAdapter a généré automatiquement Connection
, Adapter
et CommandCollection
les propriétés, mais celles-ci sont soit Friend
ou Private
, par défaut. Ces informations internes peuvent être exposées en étendant TableAdapter à l’aide de classes partielles pour inclure des Public
méthodes ou des propriétés. Vous pouvez également configurer le modificateur d'accès de la propriété Connection
de TableAdapter via la propriété ConnectionModifier
de TableAdapter.
Bonne programmation !
À propos de l’auteur
Scott Mitchell, auteur de sept livres ASP/ASP.NET et fondateur de 4GuysFromRolla.com, travaille avec les technologies Web Microsoft depuis 1998. Scott travaille en tant que consultant indépendant, formateur et écrivain. Son dernier livre est Sams Teach Yourself ASP.NET 2.0 en 24 heures. On peut le joindre à mitchell@4GuysFromRolla.com.
Merci spécial à
Cette série de tutoriels a été examinée par de nombreux réviseurs utiles. Les réviseurs principaux de ce tutoriel étaient Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy et Hilton Geisenow. Vous souhaitez consulter mes prochains articles MSDN ? Si c’est le cas, déposez-moi une ligne à mitchell@4GuysFromRolla.com.