Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

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

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
Autor:
William Ryan MVP
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.
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 .
Ursache
Das wird tatsächlich von einer Feature verursacht  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 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 . Sie möchte nicht, beliebige Möglichkeiten hier zu dauern und zu hoffen, dass ja Verwendung die Verbindung Abrufs geschlossen wird A < STARKE VERSCHLÜSSELUNG/ > Sie in Ihren Prozeduren und Ihrem Aufruf blockieren der  Methode von dort. Wenn Sie mit arbeiten, kann Sie Ihren Block in dem Verwenden umbrechen Anweisung in Verbindung Sie  Sie blockieren und Sie stellen das sicher, der < STARKE VERSCHLÜSSELUNG/ > ist  as well as  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
 Parameterized speicherte Prozedur in SQL Server
Eine gute Diskussion  Es ist wann eine gute Lösung
Eine gute Diskussion auf welchem Grund To  Abfragen
Programmgesteuert wie Konvertieren an von Dynamic SQL Statements  Abfragen

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 555167 – Letzte Überarbeitung: 07/24/2004 23:15:00 – Revision: 1.0

Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0

  • kbpubtypecca kbpubmvp kbhowto KB555167 KbMtde kbmt
Feedback
/html> async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write("