CÓMO PARA: Implementa Clase de Auxiliar para utilizar un SqlParameter con una lista de valores en una cláusula IN

Seleccione idioma Seleccione idioma
Id. de artículo: 555167 - Ver los productos a los que se aplica este artículo
Autor: William Ryan MVP
Expandir todo | Contraer todo

Síntomas

Está intentando pasar en varios valores separados por un delimitador a una instrucción SQL o un procedimiento almacenado que utilizará la lista en una Instrucción de IN y pasando en esta lista como un solo SqlParameter.

Causa

Esto es hacer realmente por una característica ADO.NET aquél realiza beneficioso utilizar Parámetros en primer lugar, escapan a los valores insertados- los pasan como un literal. Si establece SomeValue, = 1,2,3,4,5 así lo utilizó así en SELECCIÓN * de [TableName] donde SomeValue@de IN [ColumnName], no coincidirá con valores en [ColumnName] que fueron iguales que 1234 o 5. En su lugar, sólo coincidirá con valores que hubo exactamente "1,2,3,4,5". Así si esto es nuestro procedimiento:
<CÓDIGO>
Up_ProcedureHelper CREATE PROCEDURE
     O necesitará cualquier longitud VARCHAR de AS de Símbolos (50)
COMO
SELECCIONA * de [TableName]
DÓNDE IN (símbolos) [FieldName]
</CODE>
Este código fallará:
&lt;CÓDIGO&gt;
cuelga c = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand = SqlCommand nuevo ("up_ProcedureHelper" ConnectionName);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5);
      () cn.Open, realidad Connection.Open //en y ExecuteReader se deberían incluir en Try/Catch/Finally
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert (dr.HasRows "Hacer pero de Filas tener deber Nosotros") //Fails a causa de que ColumnName es un campo de Valores enteros y no contendrá "1,2,3,4,5"

}</CODE>

Solución

Change your Stored Procedure to Accommodate new Methodology
  Una forma sencilla de solucionar este problema es crear una tabla Temporal que usa la característica de tabla Temporal de Sql Server 2000. Nosotros utilizaremos un bucle simple para analizar a través de la variable separada por un delimitador dado que se ha pasado. En cada pasada a través del bucle, nosotros insertaremos cada variable en la tabla temporal. Nosotros utilizaremos una subconsulta por último para hacer los valores coincididos de la cláusula LIKE:
&lt;CÓDIGO&gt;
Up_ProcedureHelper CREATE PROCEDURE
     O necesitará cualquier longitud VARCHAR de AS de Símbolos (50)
COMO
DECLARE VARCHAR(50) en Temp AS
TITULAR CREATE TABLE # (TokenValues VARCHAR(50)))
&gt; 0 hasta LEN(@Tokens)
    COMIENCE
       IF CHARINDEX(',', @Tokens) = 0
          COMIENCE
             @ TEMP SET = @ Tokens  
             @ Tokens " SET =
             VALUES(@Temp) INSERT INTO #holder (TokenValues)
          FINAL
       MÁS
          COMIENCE
             @ Temp SET = IZQUIERDA (@ Tokens CHARINDEX(',', @Tokens)-1)     
             VALUES(@Temp) INSERT INTO #holder (TokenValues)
             @ Tokens SET = RIGHT (@ Tokens LEN(@Tokens)-LEN(@Temp)-1))
       FINAL
    FINAL
SELECCIONA * de [TableName]
DÓNDE IN [FieldName] ( TokenValues SELECT ) de #holder
</CODE>
 
Por tanto, suponiendo el parámetro "1,2,3,4,5", nosotros tendremos una tabla Temp respectivamente denominada #holder con 5 filas y los valores 1234 y 5. Existirá esta tabla mientras la conexión en la que se creó está activa. En cuanto la cerramos, la tabla se quitará automáticamente. En circunstancias normales, es imprescindible absolutamente recordar si cierra usted connections. No desea tomar cualquier posibilidad aquí y esperar que se pueda cerrar así uso la conexión un finallySTRONG < / > bloquear el paso a sus procedimientos y su llamada .Close() método desde allí. Si está utilizando C, puede ajustar su bloque al utilizar instrucción en combinación usted finally bloquea se asegura de aquél SqlConnection< STRONG / > es closed as well as disposed De (el mismo principio se aplica con todos los tipos demás de conexiones).
&lt;CÓDIGO&gt;
cuelga c = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){)
      Cmd SqlCommand = SqlCommand nuevo ("up_ProcedureHelper" ConnectionName);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5");
      () cn.Open, realidad Connection.Open //en y ExecuteReader se deberían incluir en Try/Catch/Finally
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert(dr.HasRows, "We should have Rows but Don't"), //Now que funciona la aserción y nosotros tenemos 5 filas.
}
</CODE>

Más información

Calling Un parameterized almacenó procedimiento en SQL Server
Una discusión buena Dynamic Sql Y cuándo es una solución buena
Una discusión buena en porqué para Parameterize  consultas
Cómo convertir instrucciones SQL Dinámicas mediante programación para Parameterized consultas

Propiedades

Id. de artículo: 555167 - Última revisión: sábado, 24 de julio de 2004 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Palabras clave: 
kbpubtypecca kbpubmvp kbhowto KB555167 KbMtes kbmt
Traducción automática
AVISO: Gracias por utilizar el servicio de Traducción Automática. Este artículo ha sido traducido por un sistema informático sin ayuda humana (Machine Translation). Microsoft ofrece estos artículos a los usuarios que no comprendan el inglés, exclusivamente, con el fin de que puedan entenderlos más fácilmente. Microsoft no se hace responsable de la calidad lingüística de las traducciones ni de la calidad técnica de los contenidos de los artículos así como tampoco de cualesquiera problemas, directos o indirectos, que pudieran surgir como consecuencia de su utilización por los lectores.
Haga clic aquí para ver el artículo original (en inglés): 555167
RENUNCIA LEGAL DE COMMUNITY SOLUTIONS
NI MICROSOFT IBÉRICA S.R.L. ("MICROSOFT") NI SUS RESPECTIVOS PROVEEDORES GARANTIZAN LA IDONEIDAD, FIABILIDAD NI EXACTITUD DE LA INFORMACIÓN Y LOS GRÁFICOS INCLUIDOS. TODA LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS SE PROPORCIONAN "TAL CUAL" SIN GARANTÍA DE NINGUNA CLASE. SIN PERJUICIO DE NINGUNA GARANTÍA IMPUESTA POR CUALQUIER LEY DE APLICACIÓN OBLIGADA, MICROSOFT Y/O SUS RESPECTIVOS PROVEEDORES RENUNCIAN POR LA PRESENTE A TODA GARANTÍA Y CONDICIÓN RESPECTO A ESTA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS, INCLUIDA CUALQUIER GARANTÍA Y CONDICIÓN IMPLÍCITA DE COMERCIABILIDAD, IDONEIDAD PARA UN DETERMINADO FIN, ESFUERZO RAZONABLE, TITULARIDAD Y AUSENCIA DE INFRACCIÓN. USTED ADMITE EXPRESAMENTE QUE, SIN PERJUICIO DE LOS CASOS EN LOS CUALES LA LEY VIGENTE PROHÍBA LA EXCLUSIÓN DE RESPONSABILIDAD POR DAÑOS, BAJO NINGÚN CONCEPTO, NI MICROSOFT NI SUS PROVEEDORES ACEPTARÁN RESPONSABILIDAD ALGUNA POR DAÑOS DIRECTOS O INDIRECTOS DE CUALQUIER ÍNDOLE U ORIGEN (INCLUYENDO, ENTRE OTROS, LOS DAÑOS POR PÉRDIDA DE USO, INFORMACIÓN O BENEFICIOS) QUE SE DERIVEN O ESTÉN RELACIONADOS CON EL USO O INCAPACIDAD DE USO DE LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS INCLUIDOS.

Enviar comentarios

 

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