COMO: implementar classe programa auxiliar a ser utilizada uma SqlParameter com uma lista de valores de uma cláusula IN

Traduções de Artigos Traduções de Artigos
Artigo: 555167 - Ver produtos para os quais este artigo se aplica.
Author: William Ryan MVP
Expandir tudo | Reduzir tudo

Sintomas

Que você está tentando passar nos vários valores separados por um delimitador, a uma instrução SQL ou procedimento armazenado que irá utilizar a lista numa declaração in e que são passando existentes nesta lista como um único SqlParameter.

Causa

Isto é, na realidade, causado por uma funcionalidade do ADO.NET Que torna parâmetros benéfico utilizar em quanto em primeiro lugar sequer-escape os valores inseridos aos mesmos e passá-los como um literal. * Até se você definir @ SomeValue = 1,2,3,4,5 e utilizado-lo em Select WHERE [ColumnName] in @ SomeValue, que não iria tenham valores correspondentes [ColumnName] que estavam iguais a 1,2,3,4,"Isto ou 5 from [TableName] * FROM [TableName] WHERE [ColumnName] in @ SomeValue, que não iria tenham valores correspondentes [ColumnName] que estavam iguais a 1,2,3,4,"Isto ou 5.. Em vez disso, é apenas necessário correspondem a valores que estavam exactamente 1,2,3,4,5 " ". For o caso se esta for a nossa procedimento:
<CODE>
CREATE PROCEDURE up_ProcedureHelper
     @ AS, Autonomous System VARCHAR (50)--os tokens ou qualquer comprimento irá necessitar
SA
SELECT * FROM [TableName]
WHERE [FieldName] IN (@ tokens)
</CODE>
Este código irá falhar:
<CODE>
Cadeia CS = ConfigurationSettings.AppSettings("ConnectString"));
Using(SqlConnection CN = New SqlConnection(CS)){
      Cmd SqlCommand = novo SqlCommand " (up_ProcedureHelper ", ConnectionName);
      CMD.CommandType = CommandType.StoredProcedure;
      CMD.Parameters.Add("@Token", "1,2,3,4,5);
      () cn.Open; realidade //In Connection.Open e ExecuteReader devem ser colocados entre Try / Catch / Finally
      Dr = CMD.ExecuteReader(CommandBehavior.CloseConnection);    
      Uma vez que é um campo inteiro e não mantenha " 1,2,3,4,5 " ColumnName DEBUG.ASSERT (Dr.HasRows, " linhas devem ter We mas não "); //Fails

}

Resolução

Alterar o procedimento armazenado para Accommodate novo Methodology
  Uma forma fácil de resolver este problema consiste em criar uma tabela TEMPORARY utilizando Funcionalidade tabela temporária SQL Server 2000 ' s. Utilizaremos um ciclo simples para analisar a variável tenha passada em que é separada por um delimitador determinado através de. Em cada passagem pelo loop, irá inserir cada variável na tabela temporária. Finalmente, utilizaremos uma subconsulta de modo a corresponderem aos valores na cláusula Like :
<CODE>
CREATE PROCEDURE up_ProcedureHelper
     @ AS, Autonomous System VARCHAR (50)--os tokens ou qualquer comprimento irá necessitar
SA
Declare @ VARCHAR(50) AS, Autonomous System TEMP
CREATE TABLE HOLDER(TokenValues VARCHAR(50)) #
While LEN(@Tokens) > 0
    BEGIN
       If CHARINDEX(',', @Tokens) = 0
          BEGIN
             SET @TEMP = @Tokens  
             SET @Tokens = ''
             INSERT INTO VALUES(@Temp) #Holder (TokenValues)
          End
       Else
          BEGIN
             SET @TEMP = Left (@Tokens, CHARINDEX(',', @Tokens)-1)     
             INSERT INTO VALUES(@Temp) #Holder (TokenValues)
             SET @Tokens = Right (@Tokens, LEN(@Tokens)-LEN(@Temp)-1)
       End
    End
SELECT * FROM [TableName]
WHERE in [FieldName] (TokenValues SELECT FROM #Holder)
</CODE>
 
Deste modo, partindo do princípio de que o parâmetro " 1,2,3,4,5 ", teremos uma tabela TEMP chamada #Holder com linhas 5 e os valores 1,2,3,4,"Isto & 5, respectivamente. Esta tabela existirá, desde que a ligação que foi criado em esteja em directo. Assim que as que feche-o a tabela será removida automaticamente. Em circunstâncias normais é absolutamente imperativo que se lembrar fechar o connections. Não pretende tirar qualquer hipóteses aqui e Espero que a ligação obtém fechada, for o caso utilize um finallyBloquear nos procedimentos e chamada a .Close() método a partir daí. Se você estiver usando C# , pode moldar o seu bloco sessão utilizando uma instrução em conjunto com o finally bloquear e certifique-se de que o SqlConnectioné closed bem como disposed do (o mesmo princípio aplica-se com todos os outros tipos de ligação).
<CODE>
Cadeia CS = ConfigurationSettings.AppSettings("ConnectString"));
Using(SqlConnection CN = New SqlConnection(CS)){
      Cmd SqlCommand = novo SqlCommand " (up_ProcedureHelper ", ConnectionName);
      CMD.CommandType = CommandType.StoredProcedure;
      CMD.Parameters.Add("@Token", "1,2,3,4,5");
      () cn.Open; realidade //In Connection.Open e ExecuteReader devem ser colocados entre Try / Catch / Finally
      Dr = CMD.ExecuteReader(CommandBehavior.CloseConnection);    
      DEBUG.ASSERT(Dr.HasRows, "We should have ROWS but Don't"); //Now a declaração sucede - e têm linhas 5.
}
</CODE>

Mais Informação

Calling Procedimento armazenado um parametrizadas no SQL Server
Uma discussão sobre bom Dynamic Sql e quando é uma boa solução
Uma discussão sobre o motivo para bom Parameterize  Consultas
Como pretende converter de forma programática Dynamic declarações SQL para Parameterized Consultas

Propriedades

Artigo: 555167 - Última revisão: 24 de julho de 2004 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Palavras-chave: 
kbpubtypecca kbpubmvp kbhowto KB555167 KbMtpt kbmt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Pedíamos-lhe o favor de preencher o formulário existente no fundo desta página caso tenha encontrado erros neste artigo e tenha possibilidade de colaborar no processo de aperfeiçoamento desta ferramenta. Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 555167
COMMUNITY SOLUTIONS CONTENT DISCLAIMER
MICROSOFT CORPORATION AND/OR ITS RESPECTIVE SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, OR ACCURACY OF THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN. ALL SUCH INFORMATION AND RELATED GRAPHICS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THIS INFORMATION AND RELATED GRAPHICS, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE EFFORT, TITLE AND NON-INFRINGEMENT. YOU SPECIFICALLY AGREE THAT IN NO EVENT SHALL MICROSOFT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OF OR INABILITY TO USE THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF MICROSOFT OR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.

Submeter comentários

 

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