2009-05-17 8 views
1

Dans le fournisseur .NET MySQL, vous pouvez utiliser des paramètres nommés dans la syntaxe:Avec les paramètres nommés avec MySQL .NET Provider

?parametername 

Maintenant, je suis en train de créer un paramètre nommé pour un paramètre qui sera être utilisé dans une liste 'IN', par exemple :

select * from mytable where id in (?ids) 

Comment puis-je utiliser un paramètre nommé avec cela, si je l'utilise varchar, il va ajouter des citations avant et après la liste, à savoir .:

Si je passe la valeur du paramètre à l'aide varchar :

cmd.Parameters.Add("?ids", MySqlDbType.Varchar).Value = ids; // ids is a string which contains the ids separated by commas, e.g. 1, 2, 3 .. etc 

la requête sera exécutée comme ceci:

select * from mytable where id in ('1, 2 ,3') 

Bien sûr, cela renvoie une erreur, comment puis-je passer un paramètre nommé sans obtenir les guillemets, c'est la façon dont il doit être exécuté:

select * from mytable where id in (1, 2 , 3) 

Y at-il solution de contournement pour cela? J'utilise actuellement String.Format() mais j'aimerais utiliser un paramètre nommé, est-ce possible de quelle façon?

P.S. J'utilise uniquement des instructions en texte brut, pas de sproc, donc rien de tout cela ne sera transmis à un sproc (juste au cas où vous pensez que ce n'est pas possible parce que les sprocs n'acceptent pas les tableaux)

Répondre

3

Ceci a été demandé ici tant de fois que je me suis arrêté pour compter.

C'est toujours la même réponse, indépendamment de la technologie. Vous devez simplement ajouter des paramètres "may" à votre requête si vous prévoyez d'avoir des "arguments" IN.

Si vous souhaitez interroger WHERE id IN (1, 2 ,3), votre déclaration préparée doit ressembler à ceci:

SELECT * FROM mytable WHERE id IN (?, ?, ?) 

Utilisez ce bâtiment installation de chaîne que vous voyez apte à faire une telle chaîne SQL. Après cela, ajoutez les trois valeurs de paramètre.

Il est important que les instructions préparées séparent le code SQL des données. Les virgules sont du code SQL, vous ne les obtiendrez jamais dans l'instruction avec un seul paramètre, elles doivent être en avant.

Bon, là est une alternative. Faire une table séparée/temporaire, stocker vos identifiants dans et quelque chose de requête comme ceci:

SELECT 
    * 
FROM 
    mytable m 
    INNER JOIN searchtable s ON m.id = s.id 
1

Le problème est que vous n'êtes pas passer un seul paramètre. Vous voulez passer une collection de paramètres. Pour autant que je sache, il n'y a pas encore de support pour cela (pas de DbType pour les tableaux ou les collections). Vous ne pouvez donc pas ajouter plusieurs valeurs en tant que paramètre. Puisque (je présume) que les éléments de nombre dans 'ids' peuvent varier, vous devez changer la chaîne de commande pour avoir la bonne quantité de paramètres. Il serait possible d'utiliser certaines boucles pour générer à la fois la chaîne de commande et remplir les paramètres avec leurs valeurs respectives. Cela signifie que vous créez une nouvelle commande pour chaque requête.

Une autre solution consisterait à utiliser une procédure stockée qui prend votre liste séparée par des virgules et l'utilise pour générer la requête.

Questions connexes