2011-04-18 16 views
10

deseo crear esta consulta:Cómo pasar el parámetro a sql 'en' instrucción?

select * from products where number in ('123', '234', '456'); 

pero no puedo encontrar ningún ejemplo de esto con achiving Npgsql y NpgsqlParameter. He intentado de esta manera:

string[] numbers = new string[] { "123", "234" }; 

NpgsqlCommands cmd = new NpgsqlCommands("select * from products where number in (:numbers)"); 
NpgsqlParameter p = new NpgsqlParameter("numbers", numbers); 
command.Parameters.Add(p); 

pero no funcionó;)

Respuesta

21

pasarlo como una matriz:

string[] numbers = new string[] { "123", "234" }; 

NpgsqlCommands cmd = new NpgsqlCommands("select * from products where number = ANY(:numbers)"); 
NpgsqlParameter p = new NpgsqlParameter("numbers", NpgsqlDbType.Array | NpgsqlDbType.Text); 
p.value = numbers; 
command.Parameters.Add(p); 
+0

Esto generará un error: su variable '' array' debe ser numbers' en el valor del parámetro @UwConcept –

+0

: honestamente, es mucho tiempo desde la última vez que se usa 'NPgSQL' y ni siquiera tienen un 'VS' instalado para verificar :) – Quassnoi

+0

@Adrian: ¿está correcta la sintaxis o tiene que corregirla? No puedo verificar – Quassnoi

1

Es necesario crear dinámicamente su cadena de comando - lazo con su primera parámetro como: num0, segundo como: num1, etc. Cuando los haya agregado todos, elimine el último carácter "," y reemplácelo por ")".

+0

si puede usar una matriz en la forma sugerida por Quassnoi, me gustaría con eso. –

0

Además de la respuesta de @Quassnoi, agregaré esta para mostrar, cómo lo hicimos en código real.

¡Advertencia! ¡Este código de trabajo es de proyecto real y puede dañar tus hermosos enfoques!

string commstr = "SELECT product_name, price, product_url, image_url FROM products WHERE id = ANY(@arr);"; 
NpgsqlCommand cm = new NpgsqlCommand(commstr, cn); 
NpgsqlParameter arpar = new NpgsqlParameter(); 
arpar.ParameterName = "arr"; 
arpar.NpgsqlDbType = NpgsqlDbType.Array | NpgsqlDbType.Bigint; 
arpar.Value = PerformQuerySphinx(query, limit); 
cm.Parameters.Add(arpar); 
Cuestiones relacionadas