Passage d'un paramètre SQL à une clause IN () à l'aide de jeux de données typés dans .NET
D'abord des excuses comme il y a des questions similaires sur ce site, mais aucun d'entre eux de répondre à ce problème directement.
Im en utilisant typés dans VS 2010. J'ai créer un TableAdapter dans un jeu de données avec une requête comme:
SELECT * from Table WHERE ID IN(@IDs)
Maintenant, si je l'appelle: TableAdapter.Fill(MyDataTable,"1,2,3")
une erreur se produit indiquant que VS ne peut pas convertir 1,2,3 de type int. Juste assez.
Alors j'ai décider de changer le Paramètre (c'est à dire @Id) type de chaîne dans la collection de paramètres. Essayez de nouveau - toujours le même message d'erreur.
Donc, il y a de toute façon ce dataset typé peut accepter mes "1,2,3" paramètre? Pour le moment je n'ai que quelques paramètres à passer, donc je peut facilement créer 5 ou si les paramètres et de les transmettre séparément, mais que faire si il y a des centaines? Est-il possible que je peux appeler le Fill()
méthode avec mon séparées par des virgules paramètre?
(je sais que je peux utiliser du SQL Dynamique pour créer l'instruction et de l'exécuter, mais préférez si il y a une autre façon de me permettre de garder mon dataset typé notamment pour une utilisation dans ReportViewer/bindingsources)
source d'informationauteur Simon
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser un seul paramètre, pour une liste de valeurs de cette façon. Mais il peut y avoir de base de données spécifiques à des façons d'obtenir ce que vous voulez. Par exemple, avec SQL Server 2005 ou plus tard, vous pouvez créer une table de la fonction de diviser votre paramètre de chaîne, quelque chose comme:
Vous pouvez alors l'utiliser comme suit:
J'ai essayé une solution de contournement pour l'aide de la chaîne "contient" dans SQL façon:
Dans votre cas, modifier le SQL -
Original:
Devenir:
Avec .net code -
Original:
Devenir:
SQL Server 2008 a une fonctionnalité appelée Les Paramètres De La Table
Si vous avez besoin de
SELECT * from Table WHERE ID IN (SELECT * FROM (@IDs))
CREATE TYPE MyIntArray AS TABLE ( Value INT );GO
.Cela va créer un MyIntArray "type de table" avec une seule colonne de type INT.
Malheureusement la Carte Table designer ne prend pas en charge la
SqlParameter.TypeName
argument, donc nous avons besoin de résoudre par nous-mêmes. L'objectif est de modifier laCommandCollection
propriété de l'généré TableAdapter classe. Malheureusement, cette propriété est protégée, de sorte que vous avez à tirer le TableAdapter ou par exemple utiliser la Réflexion pour l'ajuster. Voici un exemple avec une classe dérivée:Et c'est comment vous pouvez appeler cette méthode:
La seule base de données, je sais de qui peut utiliser des paramètres .NET dans une
IN
clause est PostgreSQL, parce que PostgreSQL dispose d'un concept de tableaux qui peuvent être utilisés avecIN
et Npgsql permet de tableau (ouIEnumerable<T>
) des paramètres.Avec d'autres bases de données que vous avez à construire la SQL, ou de passer d'une chaîne à une procédure de base de données qui le convertit à l'0-ou-plus paramètres et agit sur eux.
@Joe est droit.
Ou vous pouvez utiliser une boucle foreach pour le faire.
Quelque chose comme:
Ce qui concerne
Vous pouvez également créer une liste d'Id de paramètres
ainsi, au lieu de l'aide de @Id vous allez utiliser @ID1, @ID2, @ID3, etc
Et getKeys(comte de) faire quelque chose comme ceci:
et Enfin, ajoutez les paramètres:
Vous pouvez également utiliser XML de passer dans une liste de paramètres dans une procédure stockée:
1) Dans Visual Studio:
Créer un nouveau Tableadapter et créer un Dataset Typé pour obtenir un seul enregistrement:
2) Dans SQL Server Manager:
Créer une procédure stockée avec la même sélectionner les champs que votre dataset typé:
3) Dans Visual Studio:
Ajouter une Nouvelle Requête à votre Tableadapter, sélectionnez la procédure stockée créé ci-dessus usrsp_GetIds et nom il FillBy_Ids. Cela crée de la commande:
4) Dans Visual Studio:
Dans votre .net code créer une fonction utilitaire permettant de convertir un tableau de chaînes de caractères au format XML:
Exemple D'Utilisation:
Remplir votre tableau de données à l'aide de la fortement typé fonctions par le passage d'une liste de chaînes de caractères comme paramètre:
J'ai été en mesure de résoudre ce problème en définissant le
ClearBeforeFill
propriété defalse
et de remplissage de laTableAdapter
dans unforeach
boucle.