Pass Paramètre de Tableau dans SqlCommand
Je suis en train de passer de la matrice de paramètre SQL commnd en C# comme ci-dessous, mais il ne fonctionne pas. Personne ne rencontrer avant?
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(',');
- Pas vraiment le sujet, mais il me semble avoir l'Âge comme une colonne dans une table est une mauvaise idée, car elle devra être mise à jour en permanence. Les gens vieillissent, droit? Peut-être vous devriez envisager d'avoir une colonne DateOfBirth à la place?
- question avec la bonne réponse ici: stackoverflow.com/questions/83471/...
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin d'ajouter les valeurs dans le tableau une à une.
Mise à JOUR: Ici est une longue et réutilisables solution qui utilise Adam réponse de la avec son a suggéré de modifier. J'ai amélioré un peu et en fait une méthode d'extension pour le rendre encore plus facile d'appeler.
Il est appelé comme ça...
Avis de la "{Age}" dans l'instruction sql est le même que le nom du paramètre que nous adressons à AddArrayParameters. AddArrayParameters remplacera la valeur avec les paramètres corrects.
varcmd = new SqlCommand("SELECT * FROM TableA WHERE Age IN ({Age})");
je pense que tu veux direvar cmd = new SqlCommand("SELECT * FROM TableA WHERE Age IN ({Age})");
(avec un espace entrevar
etcmd
). Je ne peux pas le modifier depuis le changement est trop mineur. Espérons que cela permettra d'économiser un débutant comme moi quelques minutes à essayer de trouver la réponse.var paramPlaceholder = "{" & paramNameRoot & "}";
Debug.Assert(cmd.CommandText.Contains(paramPlaceholder), "Parameter Name Root must exist in the Source Query");
Cela devrait aider les devs s'il oublie de match paramNameRoot avec la requête.AddWithValue
de la fonction, toute chance vous pourriez résoudre ce problème?Je voulais étendre sur la réponse que Brian a contribué à les rendre facilement utilisables dans d'autres endroits.
Vous pouvez utiliser cette nouvelle fonction comme suit:
Edit:
Voici un générique variation qui fonctionne avec un tableau de valeurs de tout type et est utilisable comme une extension de la méthode:
Vous pouvez ensuite utiliser cette méthode d'extension comme suit:
Assurez-vous de définir le CommandText avant d'appeler AddArrayParameters.
Aussi assurez-vous que votre nom de paramètre ne sera pas partiellement correspondre à quelque chose d'autre dans votre déclaration (c'est à dire @AgeOfChild)
AddWithValue
de la fonction, toute chance vous pourriez résoudre ce problème?Si vous pouvez utiliser un outil comme "dapper", cela peut être tout simplement:
Dapper traitera de déballage de ce des paramètres individuels pour vous.
Si vous utilisez MS SQL Server 2008 et au-dessus, vous pouvez utiliser les paramètres de la table comme décrit ici
http://www.sommarskog.se/arrays-in-sql-2008.html.
1. Créer une table pour chaque type de paramètre que vous allez utiliser
La commande suivante crée un type de table pour les entiers:
2. Mettre en œuvre des méthodes d'assistance
3. L'utilisation de cette
table.Rows.Add(id);
résultats dans un légère odeur de code lors de l'utilisation de SonarQube. J'ai utilisé cette solution de rechange à l'intérieur de la boucle foreach:var row = table.NewRow(); row["id"] = id; table.Rows.Add(row);
.Puisqu'il s'agit d'une méthode sur
il peut être plus pratique de créer une méthode d'accepter un paramètre (nom), afin de remplacer et d'une liste de valeurs. Il n'est pas sur la Paramètres niveau (comme AddWithValue) mais sur la commande elle-même donc c'est mieux de l'appeler AddParametersWithValues et pas seulement AddWithValues:
requête:
utilisation:
la méthode d'extension:
Je veux proposer une autre façon de résoudre la limitation DE l'opérateur.
Par exemple, nous avons requête suivante
Nous voulons passer plusieurs IDs pour filtrer les utilisateurs. Malheureusement, il n'est pas possible de le faire avec C# en mode facile. Mais j'ai de mouillage solution de contournement pour cela, utilisez les "string_split" de la fonction. Nous avons besoin de réécrire un peu notre requête suivante.
Maintenant, nous pouvons facilement passer d'un paramètre énumération de valeurs séparées par des virgules.
Le passage d'un tableau d'éléments comme un effondrement de l'paramètre à la OÙ..DANS la clause échoue, car requête forme de
WHERE Age IN ("11, 13, 14, 16")
.Mais vous pouvez passer votre paramètre sous la forme d'un tableau sérialisé en XML ou JSON:
À l'aide de
nodes()
méthode:À l'aide de
OPENXML
méthode:C'est un peu plus sur le SQL côté et vous avez besoin d'un XML (avec la racine).
À l'aide de
OPENJSON
méthode (SQL Server 2016+):Noter que pour la dernière méthode, vous devez également vous assurer une Compatibilité à 130+.
Utilisation
.AddWithValue()
, Donc:sqlComm.Parameters.AddWithValue("@Age", sb.ToString().TrimEnd(','));
Sinon, vous pouvez utiliser ceci:
Votre total de l'exemple de code regarder en suit:
essayer
essayer comme ça