Configuration des paramètres de niveau connexion et commande de la couche d’accès aux données (VB)
par Scott Mitchell
Les TableAdapters d’un DataSet typé se chargent automatiquement de se connecter à la base de données, d’émettre des commandes et de remplir un DataTable avec les résultats. Toutefois, il arrive que nous souhaitions nous occuper de ces détails nous-mêmes, et dans ce tutoriel, nous apprenons à accéder aux paramètres de connexion et de commande de la base de données dans TableAdapter.
Introduction
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é de l’utilisation de la base de données et nous évitent d’avoir à écrire du code pour se connecter à la base de données, émettre une commande ou remplir les résultats dans un DataTable.
Toutefois, il arrive parfois que nous ayons besoin de nous plonger dans les profondeurs du TableAdapter et d’écrire du code qui fonctionne directement avec les objets ADO.NET. Dans le didacticiel Wrapping Database Modifications dans un transaction , par exemple, nous avons ajouté des méthodes à TableAdapter pour démarrer, valider et restaurer ADO.NET transactions. Ces méthodes utilisent un objet interne créé SqlTransaction
manuellement qui a été affecté aux objets TableAdapter SqlCommand
.
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 qui permet d’accéder ProductsTableAdapter
aux paramètres d’expiration de chaîne de connexion et de commande sous-jacents.
Utilisation des données à l’aide de ADO.NET
Microsoft .NET Framework contient une pléthore de classes conçues spécifiquement pour fonctionner avec des données. Ces classes, qui se trouvent dans l’espaceSystem.Data
de noms, sont appelées classes ADO.NET. Certaines des classes du ADO.NET 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.
Lors de l’accès par programmation aux données, le modèle suivant est couramment utilisé :
- Établissez une connexion à la base de données.
- Émettez une commande.
- Pour
SELECT
les requêtes, utilisez les enregistrements résultants.
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 INSERT
commande , UPDATE
, DELETE
ou SELECT
sur la base de données, utilisez la SqlCommand
classe .
À l’exception de l’encapsulation des modifications de la base de données dans un didacticiel Transaction , nous n’avons pas eu à é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 ayons besoin de 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. Le type de données et ConnectionString
la valeur de cette propriété sont déterminés par les sélections effectuées dans l’Assistant Configuration de TableAdapter. Rappelez-vous que lorsque nous ajoutons pour la première fois un TableAdapter à un DataSet typé, cet Assistant nous demande la source de base de données (voir 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 de l’Connections de données du serveur Explorer. 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 : Première étape de l’Assistant Configuration de TableAdapter (cliquer pour afficher l’image en taille réelle)
Prenons un moment pour inspecter le code de la propriété s Connection
TableAdapter. Comme indiqué dans le tutoriel 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 classe, en effectuant une exploration jusqu’à 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 des classes, accédez à l’espace NorthwindTableAdapters
de noms et sélectionnez la ProductsTableAdapter
classe. Cela affiche les ProductsTableAdapter
membres s dans la moitié inférieure de l’affichage de classes, comme illustré dans la figure 2. Double-cliquez sur la Connection
propriété pour voir son code.
Figure 2 : Double-Click la propriété Connection dans l’affichage classe pour afficher son code généré automatiquement
La propriété TableAdapter et d’autres Connection
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 consultée, 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, ce qui instancie _connection
et définit sa ConnectionString
propriété sur la valeur chaîne de connexion spécifiée à partir de la première étape de l’Assistant Configuration de 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 de connexion de TableAdapter soient accessibles ou personnalisables pour une requête, un utilisateur ou une page ASP.NET.
Étendons le ProductsTableAdapter
dans le Northwind
DataSet pour inclure une ConnectionString
propriété qui peut être utilisée par la couche logique métier pour lire ou modifier les chaîne de connexion utilisées par tableAdapter.
Notes
Une chaîne de connexion est une chaîne qui spécifie les informations de connexion à la 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 chaîne de connexion utilisés par divers magasins de données et fournisseurs, consultez ConnectionStrings.com.
Comme indiqué dans le tutoriel Création d’une couche d’accès aux données , les classes générées automatiquement par DataSet typés peuvent être étendues via l’utilisation 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 les chaîne de connexion pour la connexion sous-jacente de TableAdapter.
Une fois cette classe partielle créée (et enregistrée), ouvrez la ProductsBLL
classe . Accédez à l’une des méthodes existantes, tapez Adapter
, puis appuyez sur la touche de point pour afficher IntelliSense. Vous devez voir la nouvelle ConnectionString
propriété disponible dans IntelliSense, ce qui signifie que vous pouvez lire ou ajuster par programmation cette valeur à 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 entier disponible au-delà des limites de TableAdapter, vous pouvez également modifier le niveau de protection de la Connection
propriété. Le code généré automatiquement que nous avons examiné à l’étape 1 a montré que la propriété TableAdapter est Connection
marquée comme Friend
, ce qui signifie qu’elle est accessible uniquement par les classes du même assembly. Cela peut toutefois être modifié via la propriété TableAdapter ConnectionModifier
.
Ouvrez le Northwind
DataSet, cliquez sur dans ProductsTableAdapter
le Designer, puis accédez au Fenêtre Propriétés. Là, vous verrez le ConnectionModifier
défini sur sa valeur par défaut, Assembly
. Pour rendre la Connection
propriété disponible en dehors de l’assembly de Typed DataSet, remplacez la ConnectionModifier
propriété 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 en taille réelle)
Enregistrez le DataSet, puis revenez à la ProductsBLL
classe . Comme précédemment, accédez à l’une des méthodes existantes, 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 par programmation tous les 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 main qui, par défaut, a des instructions , UPDATE
et DELETE
générées INSERT
automatiquement. Cette main instructions de requête s INSERT
, UPDATE
et DELETE
sont implémentées dans le code s TableAdapter en tant qu’objet adaptateur de données ADO.NET via la Adapter
propriété . 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 tutoriels utilisent le fournisseur SqlClient, la Adapter
propriété est de type SqlDataAdapter
.
La propriété s Adapter
TableAdapter a trois propriétés de type SqlCommand
qu’elle utilise pour émettre les INSERT
instructions , UPDATE
et DELETE
:
InsertCommand
UpdateCommand
DeleteCommand
Un SqlCommand
objet est responsable de l’envoi d’une requête particulière à la base de données et possède 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 tutoriel Création d’une couche d’accès aux données, ces objets de commande peuvent être personnalisés via le Fenêtre Propriétés.
En plus de sa requête main, le 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 s de la requête main et les objets de commande pour toutes les méthodes supplémentaires sont stockés dans la propriété s CommandCollection
TableAdapter.
Prenons un moment pour examiner le code généré par ProductsTableAdapter
le dans le Northwind
DataSet pour ces deux propriétés et leurs variables membres et méthodes d’assistance de prise en charge :
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 des Adapter
propriétés et CommandCollection
imite étroitement celui de la Connection
propriété . 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 liées aux commandes 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. Toutefois, si ces informations sont nécessaires dans d’autres couches de l’architecture, elles peuvent être exposées via 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 que l’exécution de certaines requêtes dans TableAdapter a pris un temps extraordinaire. Lorsque vous utilisez TableAdapter pour exécuter l’une de ces requêtes, nous pouvons souhaiter augmenter la propriété s de l’objet de CommandTimeout
commande. Cette propriété spécifie le nombre de secondes d’attente avant l’exécution de la commande et la valeur par défaut est 30.
Pour permettre à la CommandTimeout
propriété d’être ajustée par le BLL, ajoutez la méthode suivante Public
à l’aide du fichier de classe partiel créé à l’étape ProductsDataTable
2 (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 du BLL ou de la couche de présentation pour définir le délai d’expiration de la commande pour tous les problèmes de commandes par cette instance TableAdapter.
Notes
Les Adapter
propriétés et CommandCollection
sont marquées comme Private
, ce qui signifie qu’elles sont accessibles uniquement à partir du code dans 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 dans un DataSet 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 se 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 ayons besoin de personnaliser les spécificités des ADO.NET de bas niveau, telles que la modification du chaîne de connexion ou des valeurs de délai d’expiration de connexion ou de commande par défaut. TableAdapter a des propriétés , Adapter
et générées Connection
automatiquement, mais celles-ci sont Friend
ou Private
CommandCollection
, 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 à la Connection
propriété TableAdapter via la propriété s ConnectionModifier
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 comme consultant indépendant, formateur et écrivain. Son dernier livre est Sams Teach Yourself ASP.NET 2.0 in 24 Heures. Il est accessible à l’adressemitchell@4GuysFromRolla.com . ou via son blog, qui peut être trouvé à l’adresse http://ScottOnWriting.NET.
Un merci spécial à
Cette série de tutoriels a été examinée par de nombreux réviseurs utiles. Les principaux réviseurs 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.