Welcher VERFAHRENSWEISE: für BIS: implementiert Sie Helper Class, in In-Klausel ein SqlParameter mit einer Liste der Werte zu verwenden

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 555167 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Autor: William Ryan MVP
Alles erweitern | Alles schließen

Problembeschreibung

Sie versuchen, in mehreren Werten zu übergeben, die von einem Trennzeichen zu einer SQL-Anweisung in einem IN Statement mithilfe Liste oder einer in einem IN Statement verwenden gespeicherten Prozedur getrennt werden, und in dieser Liste wie einfach übergeben Sie SqlParameter.

Ursache

Das wird tatsächlich von einer Feature verursacht ADO.NET das nimmt vorteilhaft in the first place das Verwenden von Parametern vor - sie schützen die Werte, die von In-Punkt zu ihnen eingefügt werden, und übergeben von In-Punkt sie als ein Literal. Daher 1,2,3,4,5 =, wenn Sie @ SomeValue festlegen und wenn Sie @ SomeValue festlegen es daher verwendete in SELECT* [von TableName] wo Sie IN @ SomeValue [ColumnName] Werten [von ColumnName] nicht entsprechen, die auf 1,2,3,4 oder 5 gleich waren. Sie wird nur mit Werten, die genau lagen, stattdessen übereinstimmen "1,2,3,4,5". Ja, wenn das ihre Prozedur ist:
<CODE>
CREATE PROCEDURE up_ProcedureHelper
     Sie werden unabhängige Länge benötigen @ Tokens AS VARCHAR (50)
WIE
Wählen Sie aus* [von TableName]
WO IN (@ Tokens) [Fieldname]
</CODE>
Dieser Code wird fehlschlagen:
<CODE>
C Zeichenfolge ConfigurationSettings.AppSettings("ConnectString")) =;
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand neuen SqlCommand (" up_ProcedureHelper " Verbindungsname) =;
      cmd.CommandType = adCmdStoredProc CommandType.StoredProcedure =;
      cmd.Parameters.Add("@Token", "1,2,3,4,5);
      In Try/Catch/Finally sollten cn.Open-(), //In-Wirklichkeit Connection.Open und ExecuteReader eingebunden werden
      Dr cmd.ExecuteReader(CommandBehavior.CloseConnection) =;    
      Debug.Assert (dr.HasRows "We should have Rows but Don't"); //Fails da ColumnName ein Integer-Feld ist und da "1,2,3,4,5" nicht aufnehmen

}</CODE>

Lösung

Ändern Sie Ihre gespeicherte Prozedur, um neue Methode aufzunehmen
  Das Erstellen einer Temporären Tabelle, die die Feature der Temporären Tabelle des Sql Server 2000 verwendet, ist ein einfacher dass dieses Problem beheben kann Weg. Wir werden eine einfache Schleife verwenden, um über die Variable, in der wir übergeben haben, zu analysieren, ist, die Variable durch ein bestimmtes Trennzeichen zu getrennt werden. Wir werden, um einzelnen Durchlauf bei jedem Schleife-Durchlauf jede Variable in der temporären Tabelle einfügen. Um die Werte in der Klausel WIE zuzuweisen, werden wir schließlich eine Unterabfrage verwenden:
<CODE>
CREATE PROCEDURE up_ProcedureHelper
     Sie werden unabhängige Länge benötigen @ Tokens AS VARCHAR (50)
WIE
DEKLARIEREN Sie @ VARCHAR(50) Temp AS
CREATE TABLE-#-Inhaber (TokenValues VARCHAR(50)))
> 0 während LEN(@Tokens)
    BEGINNEN SIE
       IF CHARINDEX(',', @Tokens) = 0
          BEGINNEN SIE
             SET @ TEMP @ Tokens =  
             SET @ Tokens = "
             #holder (TokenValues) INSERT INTO-VALUES(@Temp)
          ENDE
       ANDER
          BEGINNEN SIE
             SET @ Temp LEFT (@ Tokens CHARINDEX(',', @Tokens)-1) =     
             #holder (TokenValues) INSERT INTO-VALUES(@Temp)
             SET @ Tokens RIGHT (@ Tokens LEN(@Tokens)-LEN(@Temp)-1)) =
       ENDE
    ENDE
Wählen Sie aus* [von TableName]
WO IN [Fieldname] ( SELECT-TokenValues ) von #holder
</CODE>
 
Über eine Tabelle Temp jeweils mit Name #holder mit 5 Zeilen und den Werten 1,2,3,4 und 5 werden wir also verfügen, um der Parameter "1,2,3,4,5" vorausgesetzt. Diese Tabelle wird vorhanden sein, solange die Verbindung aktiv ist, unter der es erstellt wurde. Sobald wir es schließen, wird die Tabelle automatisch entfernt. Sind unbedingt absolut erforderlich unter normalen Umständen dass Sie daran denken, zu schließen Sie connections. Sie möchte nicht, beliebige Möglichkeiten hier zu dauern und zu hoffen, dass ja Verwendung die Verbindung Abrufs geschlossen wird A finally< STARKE VERSCHLÜSSELUNG/ > Sie in Ihren Prozeduren und Ihrem Aufruf blockieren der .Close() Methode von dort. Wenn Sie mit C# arbeiten, kann Sie Ihren Block in dem Verwenden umbrechen Anweisung in Verbindung Sie finally Sie blockieren und Sie stellen das sicher, der SqlConnection< STARKE VERSCHLÜSSELUNG/ > ist closed as well as disposed Von (dasselbe Prinzip gilt mit alle anderen Verbindungstypen).
<CODE>
C Zeichenfolge ConfigurationSettings.AppSettings("ConnectString")) =;
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand neuen SqlCommand (" up_ProcedureHelper " Verbindungsname) =;
      cmd.CommandType = adCmdStoredProc CommandType.StoredProcedure =;
      cmd.Parameters.Add("@Token", "1,2,3,4,5");
      In Try/Catch/Finally sollten cn.Open-(), //In-Wirklichkeit Connection.Open und ExecuteReader eingebunden werden
      Dr cmd.ExecuteReader(CommandBehavior.CloseConnection) =;    
      Debug.Assert(dr.HasRows, "We should have Rows but Don't"), //Now, das die Assertion nicht fehlschlägt, und wir verfügen über 5 Zeilen.
}
</CODE>

Weitere Informationen

Calling Parameterized speicherte Prozedur in SQL Server
Eine gute Diskussion Dynamic Sql Es ist wann eine gute Lösung
Eine gute Diskussion auf welchem Grund To Parameterize  Abfragen
Programmgesteuert wie Konvertieren an von Dynamic SQL Statements Parameterized Abfragen

Eigenschaften

Artikel-ID: 555167 - Geändert am: Samstag, 24. Juli 2004 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Keywords: 
kbpubtypecca kbpubmvp kbhowto KB555167 KbMtde kbmt
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 555167
COMMUNITY SOLUTIONS ? VERZICHTERKLÄRUNG
MICROSOFT CORPORATION BZW: SEINE LIEFERANTEN LEHNEN JEGLICHE VERANTWORTUNG FÜR DIE EIGNUNG, VERLÄSSLICHKEIT UND RICHTIGKEIT DES ENTHALTENEN INHALTS UND DER ENTHALTENEN GRAFIKEN AB. ALLE INFORMATIONEN WERDEN WIE BESEHEN OHNE JEDE GEWÄHRLEISTUNG BEREITGESTELLT. MICROSOFT UND SEINE LIEFERANTEN SIND NICHT VERANTWORTLICH UND ÜBERNEHMEN KEINE VERANTWORTUNG FÜR DIE BESCHAFFENHEIT DER ENTHALTENEN INFORMATIONEN UND GRAFIKEN EINSCHLIESSLICH JEDER KONKLUDENTEN BESCHAFFENHEIT, GARANTIE DER HANDELSÜBLICHKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK; FACHMÄNNISCHER BEMÜHUNGEN; DES EIGENTUMSVORBEHALTS ODER DER NICHTVERLETZUNG VON RECHTEN DRITTER. Die folgenden Regeln gelten für Schadensersatzforderungen und die Entschädigung für vergebliche Ausgaben, unabhängig von der Rechtsgrundlage einschließlich Schadensersatzrecht: Microsoft Corporation ist nur haftbar für absichtliche Handlungen, grobe Fahrlässigkeit, Tod oder Körperverletzung sowie für Ansprüche auf der Grundlage des Produkthaftpflichtrechts. Microsoft Corporation ist auch haftbar für leichte Fahrlässigkeit, falls die Microsoft Corporation materiellen Vertragspflichten nicht nachkommt. In solchen Fällen beschränkt sich die Haftbarkeit der Microsoft Corporation auf allgemein übliche und vorhersehbare Schadensersatzansprüche. In allen übrigen Fällen, einschließlich dem geltenden Schadensersatzrecht, ist die Microsoft Corporation nicht haftbar für leichte Fahrlässigkeit. Dies trifft ebenfalls auf die Lieferanten der Microsoft Corporation zu.

Ihr Feedback an uns

 

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