02.07.2013 Views

article de presse - Cap Data Consulting

article de presse - Cap Data Consulting

article de presse - Cap Data Consulting

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P ratique<br />

Vous remarquerez la détection <strong>de</strong> la valeur nulle du paramètre à l'ai<strong>de</strong><br />

<strong>de</strong> la propriété IsNull <strong>de</strong> celui-ci, et l'utilisation <strong>de</strong> l'objet<br />

WindowsI<strong>de</strong>ntity dans SqlContext pour retourner le nom du login<br />

connecté (l'équivalent <strong>de</strong> la fonction T-SQL system_user).<br />

Quelques notes<br />

Comme avec une procédure stockée T-SQL, vous pouvez attribuer une valeur<br />

<strong>de</strong> retour en définissant votre métho<strong>de</strong> comme retournant un SqlInt32 (ou<br />

un System.Int32, ce qui entraînera une conversion implicite) à la place du<br />

void. Il vous suffira d'indiquer votre valeur <strong>de</strong> retour par un return.<br />

Pour définir un paramètre OUTPUT, passez votre paramètre par référence.<br />

En C#, ajoutez le mot-clé ref <strong>de</strong>vant la déclaration <strong>de</strong> votre paramètre.<br />

Vous <strong>de</strong>vez également utiliser le mot-clé OUTPUT dans la déclaration<br />

<strong>de</strong> votre paramètre dans le CREATE PROCEDURE.<br />

Comme vous ne pouvez pas définir <strong>de</strong> valeur par défaut aux paramètres<br />

<strong>de</strong>s fonctions C#, les valeurs par défaut <strong>de</strong>s paramètres se définissent<br />

au CREATE PROCEDURE. Ce mécanisme vous permet d'ailleurs <strong>de</strong> créer<br />

plusieurs procédures au nom différent appelant le même co<strong>de</strong> .NET,<br />

avec <strong>de</strong>s valeurs par défaut différentes.<br />

Vous pouvez créer <strong>de</strong> toute pièce <strong>de</strong>s resultsets dans votre co<strong>de</strong>, à l'ai<strong>de</strong><br />

<strong>de</strong>s objets et métho<strong>de</strong>s suivants :<br />

SqlMeta<strong>Data</strong> Définir les colonnes <strong>de</strong> votre table et leur<br />

type <strong>de</strong> données<br />

Sql<strong>Data</strong>Record Créer <strong>de</strong>s enregistrements, en passant un<br />

tableau <strong>de</strong> SqlMeta<strong>Data</strong> au constructeur<br />

Pipe.SendResultsStart Commencer l'envoi du resultset au client<br />

(Sql<strong>Data</strong>Record)<br />

Pipe.SendResultsRow Envoyer un Sql<strong>Data</strong>Record<br />

(Sql<strong>Data</strong>Record)<br />

Pipe.SendResultsEnd() Terminer l'envoi du resultset<br />

Transactions<br />

Pour gérer l'éventuelle transaction dans laquelle votre procédure stockée<br />

peut s'exécuter, vous avez à votre disposition l'objet Transaction du<br />

namespace System.Transactions (dans System.Transactions.dll), qui est<br />

une nouveauté du framework 2.0. L'intégration entre cet objet<br />

Transaction et les transactions SQL Server est très étroite. Lorsque du<br />

co<strong>de</strong> .NET est exécuté dans le contexte du SQLCLR, l'objet<br />

System.Transactions.Transaction.Current reçoit le contexte <strong>de</strong> transaction.<br />

Si celui-ci est non nul, cela veut dire qu'une transaction est en cours.<br />

Tout co<strong>de</strong> SQL exécuté dans la connexion <strong>de</strong> contexte, et même dans une<br />

autre connexion au serveur, est enlisté dans la transaction. En fait, Cet<br />

objet est capable <strong>de</strong> convertir automatiquement la transaction locale en<br />

une transaction distribuée lorsqu'une connexion est ouverte vers un<br />

autre serveur via ADO.NET, ce qui la rend particulièrement puissante et<br />

permet <strong>de</strong> gérer les transactions distribuées avec un codage minimal.<br />

Déploiement<br />

Lorsque votre procédure est créée, il vous reste à l'intégrer dans SQL<br />

Server. Le déploiement intégré <strong>de</strong> Visual Studio 2005 (clic droit sur le<br />

projet dans l'explorateur <strong>de</strong> solutions, <strong>de</strong>ploy), va prendre toute la pro-<br />

Programmez n°85 68 avril 2006<br />

cédure en charge : copie sur le serveur, remplacement d'une éventuelle<br />

version existante, enregistrement <strong>de</strong> l'assemblage et <strong>de</strong> la procédure.<br />

-- Enregistrement l'assemblage<br />

CREATE ASSEMBLY GetSessions FROM 'c:\temp\Programmez.dll'<br />

WITH PERMISSION_SET=SAFE<br />

GO<br />

-- Enregistrer la procédure<br />

CREATE PROCEDURE GetSessions @user varchar(255) AS<br />

EXTERNAL NAME [Programmez].[StoredProcedures].[GetSessions]<br />

Vous pouvez recharger la procédure avec un ALTER, seulement si vous n'avez<br />

pas modifié son interface publique, c'est-à-dire la signature <strong>de</strong> la métho<strong>de</strong>.<br />

ALTER ASSEMBLY GetSessions FROM 'c:\temp\Programmez.dll'<br />

Ajouter une assembly<br />

Après déploiement, votre procédure pourra être appelée <strong>de</strong>puis SQL<br />

Server à l'ai<strong>de</strong> d'une comman<strong>de</strong> semblable à :<br />

exec dbo.GetSessions @user =<br />

'mondomaine\moi' –- en cas <strong>de</strong> connexion intégrée Windows<br />

Un conseil : vérifiez, par exemple à l'ai<strong>de</strong> d'une trace, ce que fait l'outil <strong>de</strong><br />

déploiement <strong>de</strong> Visual Studio. Vous pouvez préférer un déploiement<br />

manuel, par exemple pour ajuster le nom et la taille <strong>de</strong> vos paramètres, ou<br />

leur attribuer une valeur par défaut. Notez que vous pouvez très bien déclarer<br />

plusieurs fois le même assemblage avec <strong>de</strong>s noms différents et <strong>de</strong>s<br />

paramètres par défaut différents si vous le souhaitez.<br />

Si vous voulez vérifier les performances d'exécution, vous verrez passer<br />

votre procédure stockée dans le profiler <strong>de</strong> SQL Server, avec son temps CPU<br />

et les indicateurs habituels, comme si c'était une procédure Transact SQL.<br />

Nous avons vu brièvement comment créer <strong>de</strong>s procédures stockées.<br />

Sachez que <strong>de</strong> la même façon, vous pouvez créer <strong>de</strong>s fonctions, <strong>de</strong>s<br />

déclencheurs, et <strong>de</strong>s types <strong>de</strong> données personnalisés dans un langage<br />

du MSIL, ce qui ouvre tout un nouveau champ <strong>de</strong> perspectives.<br />

■ Rudi Bruchez rudi@babaluga.com<br />

(MCDBA) : http://www.babaluga.com/<br />

Niveau<br />

SGDB facile avancé expert

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!