COME: Implementa Classe Helper per utilizzare uno SqlParameter con un elenco di valori in una clausola

Traduzione articoli Traduzione articoli
Identificativo articolo: 555167 - Visualizza i prodotti a cui si riferisce l?articolo.
Autore: William Ryan MVP
Espandi tutto | Chiudi tutto

Sintomi

Si prova a passare IN più valori separati da un delimitatore a un'istruzione SQL o uno Stored procedure che utilizzerà l'elenco IN un'Istruzione IN e si passa IN questo elenco come un singolo SqlParameter.

Cause

Ciò viene provocato effettivamente da una funzionalità ADO.NET quello effettua vantaggioso utilizzare Parametri in the first place, esse sfuggono i valori da inserire a esse- li passano come un valore letterale. Se imposta SomeValue, pertanto = 1,2,3,4,5 pertanto lo ha utilizzato IN SELECT * da [TableName] SomeValue@IN [ColumnName], non corrisponderà ai valori IN [ColumnName] che erano uguali a 1234 o 5. Solo corrisponderà invece ai valori esattamente compresi "1,2,3,4,5". Caso se ciò è la nostra routine:
<CODICE>
Up_ProcedureHelper CREATE PROCEDURE
     O qualsiasi lunghezza sarà necessaria VARCHAR AS Token (50)
AS
Seleziona * da [TableName]
DOVE il (i token) [FieldName]
</CODE>
Questo codice non sarà riuscito:
<CODICE>
stringa C = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand = nuovo SqlCommand ("up_ProcedureHelper" NomeConnessione);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5);
      () cn.Open, la realtà Connection.Open //In ed ExecuteReader si dovrebbero inserire in Try/Catch/Finally
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert (dr.HasRows "Eseguire ma Righe disporre dovere Noi") //Fails perché ColumnName è un campo Integer e non conterrà "1,2,3,4,5"

}</CODE>

Risoluzione

Modificare lo Stored procedure per Adattare nuova Metodologia
  Un modo semplice risolvere questo problema consiste in creare una tabella Temporanea utilizzando la funzionalità di tabella Temporanea di Sql Server 2000. Noi utilizzeremo un ciclo semplice per analizzare tramite la variabile in cui abbiamo passato che separa un delimitatore determinato. A ogni passaggio del ciclo, noi inseriremo ogni variabile nella tabella temporanea. Noi utilizzeremo un subquery infine affinché corrispondere ai valori nella clausola LIKE:
<CODICE>
Up_ProcedureHelper CREATE PROCEDURE
     O qualsiasi lunghezza sarà necessaria VARCHAR AS Token (50)
AS
DICHIARARE VARCHAR(50) in Temp AS
CONTENITORE CREATE TABLE # (TokenValues VARCHAR(50)))
> 0 LEN(@Tokens)
    INIZIARE
       IF CHARINDEX(',', @Tokens) = 0
          INIZIARE
             @ TEMP IMPOSTATO = @ Tokens  
             @ Tokens IMPOSTATO " =
             VALUES(@Temp) INSERT INTO #holder (TokenValues)
          FINE
       ALTRO
          INIZIARE
             @ Temp IMPOSTATO = la funzione SINISTRA (@ Tokens CHARINDEX(',', @Tokens)-1)     
             VALUES(@Temp) INSERT INTO #holder (TokenValues)
             @ Tokens IMPOSTATO = la DESTRA (@ Tokens LEN(@Tokens)-LEN(@Temp)-1))
       FINE
    FINE
Seleziona * da [TableName]
DOVE (in TokenValues SELECT da #holder) [FieldName]
</CODE>
 
Per presupporre il parametro "1,2,3,4,5", noi pertanto avere una tabella Temporanea rispettivamente denominata #holder con 5 righe e i valori 1234 e 5. Questa tabella esisterà purché la connessione in cui si creava sia attiva. Appena lo chiudiamo, la tabella si rimuoverà automaticamente. Nelle circostanze ordinarie, è assolutamente indispensabile ricordarsi chiudersi connections. Non desidera richiedere alcuna possibilità qui e augurarsi l'utilizzo il caso deve chiudere la connessione un finallyAVANZARE: < / > blocca nelle procedure e nella chiamata .Close() metodo dal lì. Se si utilizza C#, è possibile racchiudere il blocco in utilizzare l'istruzione nella combinazione finally blocca si assicura quello SqlConnection< / > l'AVANZARE è closed as well as disposed Di (lo stesso principio si applica con tutti gli altri tipi di connessione).
<CODICE>
stringa C = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand = nuovo SqlCommand ("up_ProcedureHelper" NomeConnessione);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5");
      () cn.Open, la realtà Connection.Open //In ed ExecuteReader si dovrebbero inserire in Try/Catch/Finally
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert(dr.HasRows, "We should have Rows but Don't"), //Now che completa l'asserzione e noi abbiamo 5 righe.
}
</CODE>

Informazioni

Calling Un parameterized ha memorizzato la routine in SQL Server
Una discussione buona Dynamic Sql E quando esso è una soluzione buona
Una discussione buona sopra motivazione a Parameterize  query
Come convertire Istruzioni SQL dinamico al livello di programmazione a Parameterized query

Proprietà

Identificativo articolo: 555167 - Ultima modifica: sabato 24 luglio 2004 - Revisione: 1.0
Le informazioni in questo articolo si applicano a
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Chiavi: 
kbpubtypecca kbpubmvp kbhowto KB555167 KbMtit kbmt
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica. Nel caso in cui si riscontrino degli errori e si desideri inviare dei suggerimenti, è possibile completare il questionario riportato alla fine del presente articolo.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 555167
DECLINAZIONE DI RESPONSABILITÀ DI COMMUNITY SOLUTIONS
MICROSOFT CORPORATION E/O I RELATIVI FORNITORI NON RILASCIANO ALCUNA DICHIARAZIONE RELATIVAMENTE ALL'ADEGUATEZZA, AFFIDABILITÀ, ACCURATEZZA DELLE INFORMAZIONI E DELLA GRAFICA IVI CONTENUTE. LA DOCUMENTAZIONE E LA RELATIVA GRAFICA VENGONO FORNITE "COSÌ COME SONO" SENZA GARANZIA DI ALCUN TIPO. CON LA PRESENTE MICROSOFT CORPORATION E/O I RELATIVI FORNITORI NON RICONOSCONO ALCUNA GARANZIA O CONDIZIONE RELATIVAMENTE ALLE PRESENTI INFORMAZIONI, INCLUSE TUTTE LE GARANZIE E CONDIZIONI IMPLICITE DI COMMERCIABILITÀ, IDONEITÀ PER UN FINE PARTICOLARE, TITOLARITÀ E NON VIOLAZIONE DEI DIRITTI ALTRUI. IN NESSUN CASO MICROSOFT E/O I RELATIVI FORNITORI SARANNO RESPONSABILI PER DANNI SPECIALI, INDIRETTI O CONSEQUENZIALI O PER ALTRI DANNI DI QUALSIASI TIPO RISULTANTI DA PERDITA DEL DIRITTO D'USO, PERDITA DI INFORMAZIONI O MANCATO GUADAGNO, SIANO ESSI RISULTANTI DALL'ADEMPIMENTO DEL CONTRATTO, DA NEGLIGENZA O DA ALTRE AZIONI LESIVE, DERIVANTI DA O IN QUALSIASI MODO CONNESSI ALL'UTILIZZO O ALLE PRESTAZIONI DELLE INFORMAZIONI IVI DISPONIBILI, ANCHE IN CASO DI ERRORE, TORTO, NEGLIGENZA, RESPONSABILITÀ ASSOLUTA PER IL PRODOTTO, VIOLAZIONE DEL CONTRATTO, ANCHE NEL CASO IN CUI MICROSOFT O I SUOI FORNITORI SIANO STATI AVVERTITI DELLA POSSIBILITÀ DEL VERIFICARSI DI TALI DANNI.

Invia suggerimenti

 

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