Configuration des paramètres de niveau connexion et commande de la couche d’accès aux données (C#)
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-mêmes prendre en charge ces détails, et dans ce tutoriel, nous apprenons à accéder aux paramètres de connexion de base de données et de niveau commande 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 DataSet typés servent de référentiels de données, tandis que les TableAdapters agissent comme des wrappers pour communiquer avec la base de données afin de récupérer et de 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 creuser dans les profondeurs de TableAdapter et d’écrire du code qui fonctionne directement avec les objets ADO.NET. Par exemple, dans le didacticiel Wrapping Database Modifications in a Transaction , nous avons ajouté des méthodes à TableAdapter pour commencer, 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 de délai 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 sous l’égide 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 aux données par programmation, 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
dans la base de données, utilisez la SqlCommand
classe .
À l’exception du didacticiel Wrapping Database Modifications dans un transaction, nous n’avons pas eu à écrire nous-mêmes de code ADO.NET de bas niveau, car le code généré automatiquement 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 à la 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 un TableAdapter à un DataSet 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 le Connections de données de Server Explorer. Si la base de données que nous voulons utiliser n’existe pas dans la liste déroulante, vous pouvez spécifier une nouvelle connexion de base de données 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é 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 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 la 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 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 afficher son code.
Figure 2 : Double-Click la propriété Connection dans l’affichage de 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 System.Data.SqlClient.SqlConnection _connection;
private void InitConnection() {
this._connection = new System.Data.SqlClient.SqlConnection();
this._connection.ConnectionString =
ConfigurationManager.ConnectionStrings["NORTHWNDConnectionString"].ConnectionString;
}
internal System.Data.SqlClient.SqlConnection Connection {
get {
if ((this._connection == null)) {
this.InitConnection();
}
return this._connection;
}
set {
this._connection = value;
if ((this.Adapter.InsertCommand != null)) {
this.Adapter.InsertCommand.Connection = value;
}
if ((this.Adapter.DeleteCommand != null)) {
this.Adapter.DeleteCommand.Connection = value;
}
if ((this.Adapter.UpdateCommand != null)) {
this.Adapter.UpdateCommand.Connection = value;
}
for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1)) {
if ((this.CommandCollection[i] != null)) {
((System.Data.SqlClient.SqlCommand)
(this.CommandCollection[i])).Connection = value;
}
}
}
}
Lorsque la classe TableAdapter est instanciée, la variable _connection
membre est égale à null
. 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, 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 permet d’associer le nouvel SqlConnection
objet à chacun des objets de SqlCommand
TableAdapter.
Étape 2 : Exposition des paramètres de Connection-Level
Les informations de connexion doivent rester encapsulées dans TableAdapter et ne doivent pas être accessibles aux autres couches de l’architecture de l’application. Toutefois, il peut exister des scénarios où les informations de niveau de connexion de TableAdapter doivent être 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 de 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 didacticiel Création d’une couche d’accès aux données , les classes générées automatiquement par le DataSet typé 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.cs
et entrez le code suivant :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace NorthwindTableAdapters
{
public partial class ProductsTableAdapter
{
public string ConnectionString
{
get
{
return this.Connection.ConnectionString;
}
set
{
this.Connection.ConnectionString = value;
}
}
}
}
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 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 Connection
est marquée comme internal
, ce qui signifie qu’elle n’est accessible que 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 le ProductsTableAdapter
Designer, puis accédez au Fenêtre Propriétés. Vous verrez alors défini sur ConnectionModifier
sa valeur par défaut, Assembly
. Pour rendre la Connection
propriété disponible en dehors de l’assembly de Typed DataSet, remplacez la propriété par ConnectionModifier
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 et tapez, Adapter
puis appuyez sur la touche 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 INSERT
requête , UPDATE
et DELETE
sont implémentées dans le code de 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 didacticiels utilisent le fournisseur SqlClient, la Adapter
propriété est de type SqlDataAdapter
.
La propriété TableAdapter a Adapter
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 chargé d’envoyer 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 didacticiel 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, l’objet 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 main requête 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 dans le ProductsTableAdapter
Northwind
DataSet pour ces deux propriétés et leurs variables membres et méthodes d’assistance de prise en charge :
private System.Data.SqlClient.SqlDataAdapter _adapter;
private void InitAdapter() {
this._adapter = new System.Data.SqlClient.SqlDataAdapter();
... Code that creates the InsertCommand, UpdateCommand, ...
... and DeleteCommand instances - omitted for brevity ...
}
private System.Data.SqlClient.SqlDataAdapter Adapter {
get {
if ((this._adapter == null)) {
this.InitAdapter();
}
return this._adapter;
}
}
private System.Data.SqlClient.SqlCommand[] _commandCollection;
private void InitCommandCollection() {
this._commandCollection = new System.Data.SqlClient.SqlCommand[9];
... Code that creates the command objects for the main query and the ...
... ProductsTableAdapter�s other eight methods - omitted for brevity ...
}
protected System.Data.SqlClient.SqlCommand[] CommandCollection {
get {
if ((this._commandCollection == null)) {
this.InitCommandCollection();
}
return this._commandCollection;
}
}
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 null
. Dans ce cas, une méthode d’initialisation est appelée qui crée une instance de la variable membre et affecte les propriétés principales liées à la commande.
É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.cs
) :
public void SetCommandTimeout(int timeout)
{
if (this.Adapter.InsertCommand != null)
this.Adapter.InsertCommand.CommandTimeout = timeout;
if (this.Adapter.DeleteCommand != null)
this.Adapter.DeleteCommand.CommandTimeout = timeout;
if (this.Adapter.UpdateCommand != null)
this.Adapter.UpdateCommand.CommandTimeout = timeout;
for (int i = 0; i < this.CommandCollection.Length; i++)
if (this.CommandCollection[i] != null)
this.CommandCollection[i].CommandTimeout = timeout;
}
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 internal
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.