Al momento sei offline in attesa che la connessione Internet venga ristabilita

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

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
Autore:
William Ryan MVP
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.
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 .
Cause
Ciò viene provocato effettivamente da una funzionalità  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 :
<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 . Non desidera richiedere alcuna possibilità qui e augurarsi l'utilizzo il caso deve chiudere la connessione un AVANZARE: < / > blocca nelle procedure e nella chiamata  metodo dal lì. Se si utilizza , è possibile racchiudere il blocco in utilizzare l'istruzione nella combinazione  blocca si assicura quello < / > l'AVANZARE è  as well as  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
 Un parameterized ha memorizzato la routine in SQL Server
Una discussione buona  E quando esso è una soluzione buona
Una discussione buona sopra motivazione a  query
Come convertire Istruzioni SQL dinamico al livello di programmazione a  query

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 555167 - Ultima revisione: 07/24/2004 23:15:00 - Revisione: 1.0

Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0

  • kbpubtypecca kbpubmvp kbhowto KB555167 KbMtit kbmt
Feedback
head")[0].appendChild(m);