Você está offline; aguardando reconexão

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

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
Author:
William Ryan MVP
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.
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 .
Causa
Isto é, na realidade, causado por uma funcionalidade do  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 :
<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 . Não pretende tirar qualquer hipóteses aqui e Espero que a ligação obtém fechada, for o caso utilize um Bloquear nos procedimentos e chamada a  método a partir daí. Se você estiver usando , pode moldar o seu bloco sessão utilizando uma instrução em conjunto com o  bloquear e certifique-se de que o é  bem como  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
 Procedimento armazenado um parametrizadas no SQL Server
Uma discussão sobre bom  e quando é uma boa solução
Uma discussão sobre o motivo para bom  Consultas
Como pretende converter de forma programática Dynamic declarações SQL para  Consultas

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 555167 - Última Revisão: 07/24/2004 23:15:00 - Revisão: 1.0

Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0

  • kbpubtypecca kbpubmvp kbhowto KB555167 KbMtpt kbmt
Comentários