Comment puis-je récupérer une liste de paramètres d'une procédure stockée dans SQL Server
À l'aide de C# et du Système.Les données.SqlClient, est-il un moyen de récupérer une liste de paramètres qui appartiennent à une procédure stockée sur un Serveur SQL server avant que je l'exécuter?
J'ai un "multi-environnement" scénario où il y a de multiples versions d'un même schéma de base de données. Exemples d'environnements peut-être "Développement", la "mise en scène", & "Production". Le "développement" va avoir une version de la procédure stockée et "mise en scène" va en avoir une autre.
Tout ce que je veux faire est de valider que c'est un paramètre va être là avant de passer une valeur et l'appel de la procédure stockée. En évitant que SqlException plutôt que d'avoir à les attraper c'est un plus pour moi.
Joshua
source d'informationauteur Joshua Hayworth
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser SqlCommandBuilder.DeriveParameters() (voir SqlCommandBuilder.DeriveParameters - Obtenir des Informations de paramètres d'une Procédure Stockée - ADO.NET Tutoriels) ou il y a de cette façon qui n'est pas aussi élégant.
Vous voulez le SqlCommandBuilder.DeriveParameters(SqlCommand) méthode. Noter qu'il nécessite un supplément aller-retour à la base, donc c'est quelque significative des performances. Vous devriez envisager la mise en cache des résultats.
Un exemple d'appel:
Bien que ses pas exactement ce que vous voulez, voici un exemple de code qui utilise l'occurrence de SqlConnection.GetSchema() méthode pour retourner toutes les procédures stockées associé à une base de données, et par la suite tous les noms de paramètres et types pour chaque procédure stockée. L'exemple ci-dessous charge ce dans des variables. Remarque que cela revient aussi tout le "système" des procédures stockées, ce qui pourrait ne pas être souhaitable.
Steve
Vous pouvez utiliser l'objet SqlCommandBuilder, et d'appeler la DeriveParameters méthode.
Fondamentalement, vous avez besoin pour passer une commande, c'est-setup pour appeler votre procédure stockée, et il frappera la bd à découvrir les paramètres, et de créer les paramètres appropriés dans les Paramètres de propriété de la SqlCommand
EDIT: Vous êtes tous trop vite!!
Cette déclaration fait ce que j'en ai besoin.
Voici un exemple de code complet pour la façon dont j'ai résolu ce problème.
Marque a la meilleure mise en œuvre de DeriveParameters. Comme il le dit, assurez-vous de cache comme dans ce tutoriel.
Cependant, je pense que c'est une manière dangereuse de la résolution de votre problème d'origine de la base de données de la procédure stockée de contrôle de version. Si vous allez modifier la signature d'une procédure en ajoutant ou en supprimant des paramètres, vous devez effectuer l'une des opérations suivantes:
En s'appuyant sur DeriveParameters pour valider la version de la procédure stockée que vous utilisez semble que le mauvais outil pour le travail, à mon humble avis.
Tous ces ADO.NET des solutions sont à sont à demander à la bibliothèque de code pour interroger la base de données de métadonnées de l'en votre nom. Si vous allez prendre que les performances de toute façon, vous devriez peut-être juste écrire de certaines fonctions d'assistance qui appel
Ou peut-être même générer vos paramètres en fonction du param liste, vous obtenez de retour. Cette technique permet de travailler avec plusieurs versions de MS SQL et parfois d'autres ANSI SQL bases de données.
J'ai été en utilisant DeriveParameters avec .NET 1.1 et 2.0 depuis quelques années maintenant, et a travaillé comme un charme à chaque fois.
Maintenant, je travaille sur mon premier travail avec .NET 3.5, et viens de trouver et vilaine surprise: DeriveParameters est la création de tous les paramètres avec SqlDbType "Variante", plutôt bon SqlDbTypes. C'est la création d'une SqlException lorsque vous tentez d'exécuter SPs avec des paramètres numériques, car SQL Server 2005 indique que sql-variante types de ne peut pas être implictily converti en int (ou smallint ou numérique) les valeurs.
Je viens de tester le même code .NET CF 2.0 et SQL Server 2000, et a fonctionné comme prévu, l'attribution de la SqlDbType appropriée à chacun des paramètres.
J'avais testé .NET 2.0 apps par rapport à SQL Server 2005 Bases de données, n'est donc pas un Serveur SQL server, de sorte qu'il doit être quelque chose en rapport avec .NET 3.5
Des idées?