J'essaie de passer le paramètre de tableau à SQL commnd en C # comme ci-dessous, mais cela ne fonctionne pas. Quelqu'un l'a-t-il déjà rencontré?
string sqlCommand = "SELECT * from TableA WHERE Age IN (@Age)";
SqlConnection sqlCon = new SqlConnection(connectString);
SqlCommand sqlComm = new SqlCommand();
sqlComm.Connection = sqlCon;
sqlComm.CommandType = System.Data.CommandType.Text;
sqlComm.CommandText = sqlCommand;
sqlComm.CommandTimeout = 300;
sqlComm.Parameters.Add("@Age", SqlDbType.NVarChar);
StringBuilder sb = new StringBuilder();
foreach (ListItem item in ddlAge.Items)
{
if (item.Selected)
{
sb.Append(item.Text + ",");
}
}
sqlComm.Parameters["@Age"].Value = sb.ToString().TrimEnd(',');
Réponses:
Vous devrez ajouter les valeurs du tableau une par une.
MISE À JOUR: Voici une solution étendue et réutilisable qui utilise la réponse d'Adam avec sa modification suggérée. Je l'ai un peu amélioré et en ai fait une méthode d'extension pour le rendre encore plus facile à appeler.
Cela s'appelle comme ça ...
Notez que "{Age}" dans l'instruction sql est le même que le nom du paramètre que nous envoyons à AddArrayParameters. AddArrayParameters remplacera la valeur par les paramètres corrects.
la source
var paramPlaceholder = "{" & paramNameRoot & "}";
Debug.Assert(cmd.CommandText.Contains(paramPlaceholder), "Parameter Name Root must exist in the Source Query");
Cela devrait aider les développeurs s'ils oublient de faire correspondre paramNameRoot avec la requête.Je voulais développer la réponse que Brian a contribué à rendre cela facilement utilisable dans d'autres endroits.
Vous pouvez utiliser cette nouvelle fonction comme suit:
Edit: Voici une variante générique qui fonctionne avec un tableau de valeurs de n'importe quel type et est utilisable comme méthode d'extension:
Vous pouvez ensuite utiliser cette méthode d'extension comme suit:
Assurez-vous de définir le CommandText avant d'appeler AddArrayParameters.
Assurez-vous également que le nom de votre paramètre ne correspondra partiellement à rien d'autre dans votre déclaration (par exemple @AgeOfChild)
la source
AddWithValue
fonction, avez-vous une chance de résoudre ce problème?Si vous pouvez utiliser un outil comme "dapper", cela peut être simplement:
Dapper se chargera de le déballer en paramètres individuels pour vous .
la source
'{1,2,3}'
arguments de style pour une fonction (pas une clause WHERE IN), mais je préfère utiliser ODBC simple sinon tracas de tableau. Je suppose que j'aurais également besoin de Dapper ODBC dans ce cas. Voici ce qu'il veut tirer. snipboard.io/HU0RpJ.jpg . Peut-être devrais-je en lire plus sur Dapper ...Si vous utilisez MS SQL Server 2008 et supérieur, vous pouvez utiliser des paramètres table comme décrit ici http://www.sommarskog.se/arrays-in-sql-2008.html .
1. Créez un type de tableau pour chaque type de paramètre que vous utiliserez
La commande suivante crée un type de table pour les entiers:
2. Mettre en œuvre des méthodes d'assistance
3. Utilisez-le comme ça
la source
table.Rows.Add(id);
entraîne une légère odeur de code lors de l'utilisation de SonarQube. J'ai utilisé cette alternative à l' intérieur du foreach:var row = table.NewRow(); row["id"] = id; table.Rows.Add(row);
.Puisqu'il existe une méthode sur
il peut être plus pratique de créer une méthode acceptant un paramètre (nom) à remplacer et une liste de valeurs. Ce n'est pas au niveau des paramètres (comme AddWithValue ) mais sur la commande elle-même, il est donc préférable de l'appeler AddParametersWithValues et pas seulement AddWithValues :
requete:
usage:
la méthode d'extension:
la source
Je veux proposer une autre façon, comment résoudre la limitation avec l'opérateur IN.
Par exemple, nous avons la requête suivante
Nous voulons passer plusieurs identifiants pour filtrer les utilisateurs. Malheureusement, il n'est pas possible de faire avec C # de manière simple. Mais j'ai une solution de contournement pour cela en utilisant la fonction "string_split". Nous devons réécrire un peu notre requête pour suivre.
Maintenant, nous pouvons facilement passer une énumération de paramètres de valeurs séparées par une virgule.
la source
La transmission d'un tableau d'éléments en tant que paramètre réduit à la clause WHERE..IN échouera car la requête prendra la forme de
WHERE Age IN ("11, 13, 14, 16")
.Mais vous pouvez passer votre paramètre en tant que tableau sérialisé en XML ou JSON:
En utilisant la
nodes()
méthode:En utilisant la
OPENXML
méthode:C'est un peu plus du côté SQL et vous avez besoin d'un XML approprié (avec root).
Utilisation de la
OPENJSON
méthode (SQL Server 2016+):Notez que pour la dernière méthode, vous devez également avoir un niveau de compatibilité à 130+.
la source
Vue d'ensemble: utilisez le DbType pour définir le type de paramètre.
la source
Utilisez
.AddWithValue()
, donc:sqlComm.Parameters.AddWithValue("@Age", sb.ToString().TrimEnd(','));
Vous pouvez également utiliser ceci:
Votre échantillon de code total examinera ensuite:
la source
Voici une variante mineure de la réponse de Brian que quelqu'un d'autre pourrait trouver utile. Prend une liste de clés et la dépose dans la liste des paramètres.
la source
essayer
la source
essayez-le comme ça
la source