TO COMMENT : vous implémentez Helper Class à utiliser un SqlParameter avec une liste de valeurs dans une clause IN

Traductions disponibles Traductions disponibles
Numéro d'article: 555167 - Voir les produits auxquels s'applique cet article
Auteur: William Ryan MVP
Agrandir tout | Réduire tout

Symptômes

Vous essayez de passer dans plusieurs valeurs séparées par un délimiteur à une Instruction SQL qui utilisera la liste dans un IN Statement ou une procédure stockée et transmettez dans cette liste comme seule SqlParameter.

Cause

Cela est réellement dû à une fonctionnalité ADO.NET qui effectue utile d'utiliser en premier Paramètres - enfuient les valeurs insérées dans à leur et ils les transmettent dans en tant que l'une littéral. Si vous définissez @ SomeValue, donc = 1,2,3,4,5 et l'a utilisé dans SÉLECTION* [de TableName] IN @ SomeValue [ColumnName] aux valeurs [dans ColumnName] qui étaient égales à 1,2,3,4 ou 5, ne pas avez correspondu où vous. Vous avez que rempli à place les valeurs qui étaient exactement "1,2,3,4,5". Si si cela est notre procédure :
<CODE>
Up_ProcedureHelper CREATE PROCEDURE
     Vous de toute longueur, besoin aurez @ Tokens AS VARCHAR (50)
COMME
SELECT* [de TableName]
[FieldName] OÙ (dans @ Tokens)
</CODE>
Ce code échouera :
&lt;CODE&gt;
Vous C chaînez = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand = SqlCommand nouveau (" up_ProcedureHelper " ConnectionName);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5);
      Ont dû être encapsulés dans Try/Catch/Finally () cn.Open, la réalité Connection.Open //In et ExecuteReader
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert (dr.HasRows "We should have Rows but Don't"); //Fails parce qu'est un champ de Nombres entiers et parce que ColumnName ne contiendra pas "1,2,3,4,5"

}</CODE>

Résolution

Change your Stored Procedure to Accommodate new Methodology
  Une créer en utilisait la fonctionnalité de table Temporaire de Sql Server 2000 table Temporaire est une moyen facile à résoudre ce problème. Nous utiliserons une boucle simple pour analyser par l'intermédiaire de la variable nous transmise dans la variable par l'intermédiaire de la variable séparée par un délimiteur donné. À chaque passage de la boucle, nous insérerons chaque variable dans la table temporaire. Enfin, nous utiliserons un sous-requête pour faire correspondre les valeurs dans la clause COMME :
&lt;CODE&gt;
Up_ProcedureHelper CREATE PROCEDURE
     Vous de toute longueur, besoin aurez @ Tokens AS VARCHAR (50)
COMME
DÉCLAREZ @ VARCHAR(50) Temp AS
DÉTENTEUR (TokenValues VARCHAR(50))) # CREATE TABLE
&gt; 0 en LEN(@Tokens)
    COMMENCEZ
       IF CHARINDEX(',', @Tokens) = 0
          COMMENCEZ
             @ TEMP SET = @ Tokens  
             @ Tokens SET = "
             VALUES(@Temp) INSERT INTO #holder (TokenValues)
          FIN
       AUTRE
          COMMENCEZ
             @ Temp SET = LEFT (@ Tokens, CHARINDEX(',', @Tokens)-1)     
             VALUES(@Temp) INSERT INTO #holder (TokenValues)
             @ Tokens SET = RIGHT (@ Tokens, LEN(@Tokens)-LEN(@Temp)-1))
       FIN
    FIN
SELECT* [de TableName]
OÙ [FieldName] IN ( TokenValues SELECT ) de #holder
</CODE>
 
Nous posséderons en supposant le paramètre "1,2,3,4,5" ainsi, une table Temp respectivement appelée #holder avec 5 lignes et les valeurs 1,2,3,4 et 5. Cette table existera tant que la connexion sous laquelle elle a été créé est active. Dès que nous le fermons, la table sera supprimée automatiquement. Il est dans des circonstances ordinaires, absolument obligatoire que vous n'oubliez pas de fermer, vous connections. Vous ne souhaitez entrer ici en aucune chance et espérer qu'utilisation si doit fermée être la connexion, a finally< STRONG/ > vous bloquez dans vos procédures et appel the .Close() méthode de là. Si vous utilisez C#, vous pouvez vous envelopper votre bloc dans une instruction en association utilisant finally Vous bloquez et vous vous assurez qui the SqlConnection< STRONG/ > il y a closed as well as disposed De (le même principe s'applique avec tous tous types de connexion).
&lt;CODE&gt;
Vous C chaînez = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand = SqlCommand nouveau (" up_ProcedureHelper " ConnectionName);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5");
      Ont dû être encapsulés dans Try/Catch/Finally () cn.Open, la réalité Connection.Open //In et ExecuteReader
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert(dr.HasRows, "We should have Rows but Don't"), //Now que l'assertion réussit et nous comportent 5 lignes.
}
</CODE>

Plus d'informations

Calling Procédures stockées d'un parameterized dans SQL Server
Une bonne discussion Dynamic Sql Il est quand une meilleure solution
Une bonne discussion sur quel pourquoi à Parameterize  requêtes
Comment convertir Dynamic SQL Statements par programme en Parameterized requêtes

Propriétés

Numéro d'article: 555167 - Dernière mise à jour: samedi 24 juillet 2004 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Mots-clés : 
kbpubtypecca kbpubmvp kbhowto KB555167 KbMtfr kbmt
Traduction automatique
TRADUCTION AUTOMATIQUE : Cet article technique a été traduit par un système automatique, c'est-à-dire sans aucune intervention humaine. Microsoft propose ce type d?articles en complément de ceux traduits par des traducteurs professionnels. Ces articles sont destinés principalement aux utilisateurs ne comprenant pas l'anglais en leur proposant, en complément, une version française de l?information technique fournie dans la version américaine et originale de l?article. Pour plus de détails, veuillez consulter la page http://support.microsoft.com/gp/mtdetails. Attention : Il est possible que certaines parties de l?article ne soient pas traduites par le système automatique et qu?elles soient restées rédigées en anglais. Microsoft ne garantit pas la qualité linguistique des traductions et ne peut être tenu responsable d?aucun problème, direct ou indirect, dû à une quelconque erreur de traduction du contenu ou de son utilisation par les utilisateurs.
La version anglaise de cet article est la suivante: 555167
EXCLUSION DE RESPONSABILITÉ DE COMMUNITY SOLUTIONS
Clause limitative de responsabilité MICROSOFT CORPORATION ET/ OU SES FOURNISSEURS RESPECTIFS NE GARANTISSENT EN AUCUNE FACON LE CARACTERE ADAPTE, FIABLE OU EXACT DES INFORMATIONS ET ELEMENTS GRAPHIQUES CONNEXES. L?ENSEMBLE DE CES INFORMATIONS ET ELEMENTS GRAPHIQUES CONNEXES EST FOURNI "EN L?ETAT", SANS GARANTIE DE QUELQUE NATURE QUE CE SOIT. MICROSOFT CORPORATION ET/ OU SES FOURNISSEURS RESPECTIFS EXLUENT EXPRESSEMENT TOUTES GARANTIES ET CONDITIONS SUR CES INFORMATIONS ET ELEMENTS GRAPHIQUES CONNEXES, ET NOTAMMENT DE TOUTES GARANTIES IMPLICITES QUANT A LEUR CONFORMITE A LEUR DESTINATION COMMERCIALE, A LEUR ADEQUATION A UN BUT DETERMINE, AU RESPECT DES REGLES DE L?ART, A L?EXISTENCE D?UN DROIT DE PROPRIETE ET D?ABSENCE DE CONTREFACON. VOUS VOUS ENGAGEZ EN PARTICULIER A CE QUE NI MICROSOFT NI SES FOURNISSEURS NE SOIENT EN AUCUN CAS TENUS POUR RESPONSABLES DE TOUT DOMMAGE DIRECT, INDIRECT, PUNITIF, INCIDENT, SPECIAL, OU ACCESSOIRE, NI REDEVABLE DE DOMMAGES ET INTERETS QUELS QU?ILS SOIENT, Y COMPRIS, SANS LIMITATION AUCUNE, DE TOUTE INDEMNISATION POUR PERTE DE DONNEES OU DE PROFIT OU POUR IMPOSSIBILITE D?UTILISATION, RESULTANT DE L?UTILISATION OU DE L?IMPOSSIBILITE D?UTILISATION DES INFORMATIONS OU ELEMENTS GRAPHIQUES CONNEXES TELS QUE VISES AUX PRESENTES, QUE CETTE ACTION SOIT CONTRACTUELLE OU DELICTUELLE, FONDEE SUR LA RESPONSABILITE SANS FAUTE OU SUR TOUT AUTRE MOTIF, ET MEME SI MICROSOFT OU L?UN QUELCONQUE DE SES FOURNISSEURS AVAIT ETE AVISE AU PREALABLE DE LA POSSIBILITE D?UN TEL PREJUDICE.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com