Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

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

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
Autor:
William Ryan MVP
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.
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 .
Causa
Esto es hacer realmente por una característica  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 . No desea tomar cualquier posibilidad aquí y esperar que se pueda cerrar así uso la conexión un STRONG < / > bloquear el paso a sus procedimientos y su llamada  método desde allí. Si está utilizando C, puede ajustar su bloque al utilizar instrucción en combinación usted  bloquea se asegura de aquél < STRONG / > es  as well as  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
 Un parameterized almacenó procedimiento en SQL Server
Una discusión buena  Y cuándo es una solución buena
Una discusión buena en porqué para  consultas
Cómo convertir instrucciones SQL Dinámicas mediante programación para  consultas

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 555167 - Última revisión: 07/24/2004 23:15:00 - Revisión: 1.0

Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0

  • kbpubtypecca kbpubmvp kbhowto KB555167 KbMtes kbmt
Comentarios
>