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();
}
}
}
Vous devez créer de nouvelles SqlParameter cas, pas de réutiliser le même. Ils sont passés par référence. Vous êtes l'écraser. En conséquence, lorsque vous appelez ajouter encore une fois, vous essayez d'ajouter un paramètre qui existe déjà depuis que vous avez mis à jour le nom de la première. Ils sont le même objet.
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