Estoy tratando de pasar esta cadena generada dinámicamente (1,2,3,4) pero obtengo el error:

La conversión falló al convertir el valor nvarchar '1, 2, 3, 4' al tipo de datos int

¿Cómo puedo corregir este error?

    public DataTable GetAll(int [] idArray)
    {
        DataTable dt = new DataTable();

        var paramNames =   Enumerable
                          .Range(0, idArray.Length)
                          .Select(index => $"@prm{index}")
                          .ToArray();
        string query = $"SELECT link FROM Test WHERE id IN ({string.Join(",", paramNames)}) ORDER BY seq.Sequence";

        try
        {
            using (SqlConnection conn = new SqlConnection(connStringUniApp))
            {
                conn.Open();
                using (SqlCommand command = new SqlCommand(query, conn))
                {
                    for (int i = 0; i < paramNames.Length; ++i)
                    {
                        command.Parameters.Add(new SqlParameter(paramNames[i], idArray[i]));
                    }

                    using (SqlDataReader rdr = command.ExecuteReader())
                    {
                        dt.Load(rdr);
                    }
                    command.Parameters.Clear();
                }
                return dt;
                Console.Write(dt);
            }
        }
        catch (Exception ex)
        {
            Console.Write(ex.ToString());
            return dt;
        }
    }
1
user6934713 28 dic. 2016 a las 13:09

3 respuestas

La mejor respuesta

Debe generar muchos parámetros:

string[] paramValues = parameterString.Split(',');

var paramNames = Enumerable
  .Range(0, paramValues.Length)
  .Select(index => $"@prm{index}")
  .ToArray();

string query = $"SELECT * from test WHERE testId IN ({string.Join(",", paramNames)})";

...

for (int i = 0; i < paramNames.Length; ++i)
  command.Parameters.Add(new SqlParameter(paramNames[i], paramValues[i]));

O no use parámetros en absoluto y agregue la cadena como es más fácil de implementar pero propensa a inyección SQL y es por eso que no se puede recomendar:

string query = $"SELECT * from test WHERE testId IN ({ParameterString})";
0
Dmitry Bychenko 28 dic. 2016 a las 10:42

Puede escribir una función en el servidor SQL y llamar a la función para dividir su parámetro de cadena y obtener una ID entera para verificar la condición.

string query = "SELECT * from test t join [dbo].[SplitStringByComma](@ParameterString, ',') s on  s.value = testId ORDER BY Id"

Su función para dividir cadenas por comas es la siguiente:

ALTER FUNCTION [dbo].[SplitStringByComma]  (    
@SplitString varchar(max),
@char char)
RETURNS @Values TABLE 
(
 value int
)
AS

begin
declare @CharPosition int
declare @SubString varchar(max)
set @SplitString = RTRIM(LTRIM(@SplitString))   
  if(len(@SplitString)>0 and CHARINDEX(@char,@SplitString)>0)
  begin
    while(CHARINDEX(@char,@SplitString)>0)
        begin
        set @CharPosition = CHARINDEX(@char,@SplitString)
        set @SubString= SUBSTRING(@SplitString,0,@CharPosition)
        if(len(@SubString)>0)
        insert into @Values
        select @SubString
        set @SplitString = SUBSTRING(@SplitString,@CharPosition+1,LEN(@SplitString))        
        end
        if(len(@SubString)>0)
        insert into @Values select @SplitString
   end
   else
        insert into @Values select @SplitString
return
end     
0
Manjunathv111223 28 dic. 2016 a las 11:19

Probar esto

command.Parameters.Add(new SqlParameter("@ParameterString", Convert.ToInt32(parameterString.ToString())));
0
Genish Parvadia 28 dic. 2016 a las 10:16