Pregunta

Yo entiendo que en Postgres pura, puede pasar una matriz de enteros en una función, pero que este no es compatible con el proveedor de datos .NET Npgsql.

Actualmente tengo un DbCommand en la que me carga una llamada a un procedimiento almacenado, agregue en un parámetro y ejecutar escalar para volver a poblar una identificación con un objeto.

Esto ahora tiene que tomar n enteros como argumentos. Estos se utilizan para crear registros secundarios que unen el registro recién creado por su ID de los argumentos enteros.

Lo ideal es que preferiría no tener que hacer varias llamadas ExecuteNonQuery en mi DbCommand para cada uno de los números enteros, por lo que estoy a punto de construir una cadena csv como un parámetro que se divide en el lado de base de datos.

Normalmente vivo en LINQ 2 SQL saboreando la abstracción Db, trabajando en este proyecto con el acceso de datos manual Todo esto es sólo conseguir un poco sucio, ¿cómo la gente suele ir por pasar este tipo de parámetros en Postgres?

¿Fue útil?

Solución

Ver: http://www.postgresql.org/docs/9.1/ estático / arrays.html

Si el controlador no nativo todavía no le permite pasar matrices, a continuación, se puede:

  • pasar una representación de cadena de una matriz (que su procedimiento almacenado entonces puede analizar en una matriz - ver string_to_array )

    CREATE FUNCTION my_method(TEXT) RETURNS VOID AS $$ 
    DECLARE
           ids INT[];
    BEGIN
           ids = string_to_array($1,',');
           ...
    END $$ LANGUAGE plpgsql;
    

    entonces

    SELECT my_method(:1)
    

    con: 1 = '1,2,3,4'

  • confiar en sí Postgres a emitir a partir de una cadena en una matriz

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;
    

    entonces

    SELECT my_method('{1,2,3,4}')
    
  • optar por no usar variables se unen y emita una cadena de comando explícito con todos los parámetros enunciados en su lugar (asegúrese de validar o escapar de todos los parámetros que vienen de fuera para evitar ataques de inyección SQL.)

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;
    

    entonces

    SELECT my_method(ARRAY [1,2,3,4])
    

Otros consejos

Me di cuenta que es una vieja pregunta, pero me tomó varias horas para encontrar una buena solución y pensé que iba a pasar en lo que aprendí aquí y salvar a otra persona el problema. Pruebe, por ejemplo,

SELECT * FROM some_table WHERE id_column = ANY(@id_list)

donde @id_list se une a un int [] parámetro a modo de

command.Parameters.Add("@id_list", NpgsqlDbType.Array | NpgsqlDbType.Integer).Value = my_id_list;

donde comando es un NpgsqlCommand (usando C # y Npgsql en Visual Studio).

Puede siempre utilizar una cadena con el formato adecuado. El truco es el formato.

command.Parameters.Add("@array_parameter", string.Format("{{{0}}}", string.Join(",", array));

Tenga en cuenta que si la matriz es una matriz de cadenas, entonces usted tendrá que utilizar array.Select (valor => string.Format ( "\" {0} \", valor)) o su equivalente. Yo uso este estilo para una matriz de un tipo enumerado en PostgreSQL, porque no hay conversión automática de la matriz.

En mi caso, mi tipo enumerado tiene algunos valores como 'valor1', 'valor2', 'valor3', y mi C # enumeración se emparejan valores. En mi caso, la consulta SQL definitiva termina buscando algo así como (E '{ 'valor1', 'valor2'}'), y esto funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top