Erreur: “Le SqlParameter est déjà contenue par un autre SqlParameterCollection” lors de l'ajout d'un Paramètre
J'ai un peu les mêmes fonctions qui interagissent avec mon serveur SQL (sélectionne, les appels à la stockées procdures etc.) et tous les travaux à l'exception de celui-ci. Chaque SqlConnection
est contenue dans un bloc using avec le SqlCommand
également contenues dans un bloc using.
Ce code est en échec lors de la tentative d'ajout de la @LastUpdated
paramètre. J'ai essayé quelques suggestions que j'ai vu dans d'autres posts: cmd.Parameters.Clear()
, de l'emballage lors de l'utilisation, etc., mais pas de chance. Quelques postes avec le même message d'erreur ont été résolus en double, tente de définir le même paramètre où le trouver. Il est possible que je me manque, mais j'ai regardé sur ce pour quelques heures, et même nettoyer les lunettes. N'importe quelle direction serait appréciée.
private void _AddCartItem(bool hasEventInCart, _EventCart cartContents, ref int cartItemId)
{
using (SqlConnection sqlConnection = new SqlConnection(_striMISConnection))
{
sqlConnection.Open();
using (SqlCommand cmd = sqlConnection.CreateCommand())
{
SqlParameter param = new SqlParameter();
cmd.Parameters.Clear();
//add/update CartItem
if (hasEventInCart)
{
//Update item
cmd.CommandText = "SProc2Insert @CartItemId, @ID, 'Event', @Created, @LastUpdated";
param.ParameterName = "@CartItemId";
param.Value = cartItemId;
cmd.Parameters.Add(param);
}
else
{
//add item
cmd.CommandText = "SProc2Update @ID, 'Event', @Created, @LastUpdated";
}
cmd.CommandType = CommandType.Text;
param.ParameterName = "@Created";
param.Value = DateTime.Now.ToString();
cmd.Parameters.Add(param);
param.ParameterName = "@LastUpdated";
param.Value = DateTime.Now.ToString();
**cmd.Parameters.Add(param);**
param.ParameterName = "@ID";
param.Value = this.ID;
cmd.Parameters.Add(param);
if (hasEventInCart)
{
cmd.ExecuteNonQuery(); //do the update
}
else
{
cartItemId = (int)cmd.ExecuteScalar();
foreach (var currentCartEvent in cartContents.CartEvents)
{
if (currentCartEvent.EventCode == this.EventCode)
{
currentCartEvent.CartItemID = cartItemId;
}
}
}
cmd.Parameters.Clear();
}
}
}
Créer une nouvelle instance de votre SqlParameter ou faire IEnumerable<SqlParameter> puis cmd.Les paramètres.AddRange
Conseils: Ajout d'un paramètre et le paramètre de la valeur peut être fait en une seule instruction:
sqlCommand.Parameters.Add("@Filename", System.Data.SqlDbType.VarChar, 64).Value = "Foo";
. L'ajout de output
ou returnvalue
paramètres peut être fait en une seule instruction: sqlCommand.Parameters.Add("@Filename", System.Data.SqlDbType.VarChar, 64).Direction = System.Data.ParameterDirection.Output;
. C'est un peu bizarre que vous êtes de passage à DateTime
valeurs comme des chaînes de caractères plutôt que DateTime
ou une autre type de données (Date
, DateTimeOffset
, ... .).merci pour le raccourci. C'est un premier passage sur la fonction. Je vais la nettoyer et ajuster les valeurs de type DateTime.
OriginalL'auteur JPrez | 2015-09-03
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, si vous êtes à l'appel d'une procédure stockée, vous devez définir votre
CommandType
àCommandType.StoredProcedure
- pasText
:et il suffit d'utiliser le nom de la procédure stockée en tant que votre commande de requête:
Deuxième, je ne voudrais pas utiliser un seul
SqlParameter
instance et continuer à ajouter que, encore et encore, je voudrais juste utiliser le.Add()
méthode directement - et cesser de conversion tous les date/heure à la chaîne! Utiliser le approprié type de données natif ils ont -DateTime
- et spécifier en tant que tel dans votreParameters.Add()
appel:CommandType
àStoredProcedure
, l'auteur aurait besoin pour déposer la liste des paramètres. L'auteur doit passer "Événement" comme paramètre ainsi, s'il devait changer le type de commande.merci à vous deux pour les réponses. Les réponses précédentes n'a résoudre le problème, cependant, vos suggestions sont les bienvenues.
OriginalL'auteur marc_s
J'ai eu le même problème, vous pouvez résoudre ce problème avec le code ci-dessous:
OriginalL'auteur Sportac