Целочисленные массивы Postgres в качестве параметров?

StackOverflow https://stackoverflow.com/questions/570393

Вопрос

Я понимаю, что в Postgres pure вы можете передать целочисленный массив в функцию, но это не поддерживается в .Поставщик сетевых данных Npgsql.

В настоящее время у меня есть DbCommand, в который я загружаю вызов сохраненной процедуры, добавляю параметр и выполняю scalar, чтобы вернуть идентификатор для заполнения объекта.

Теперь это должно принимать n целых чисел в качестве аргументов.Они используются для создания дочерних записей, связывающих вновь созданную запись по ее идентификатору с целочисленными аргументами.

В идеале я бы предпочел не выполнять несколько вызовов ExecuteNonQuery в моей DbCommand для каждого из целых чисел, поэтому я собираюсь создать строку csv в качестве параметра, который будет разделен на стороне базы данных.

Обычно я живу в LINQ 2 SQL, наслаждаясь абстракцией Db, работая над этим проектом с ручным доступом к данным, все это становится немного грязным, как люди обычно передают такого рода параметры в postgres?

Это было полезно?

Решение

Видишь: http://www.postgresql.org/docs/9.1/static/arrays.html

Если ваш неродной драйвер по-прежнему не позволяет вам передавать массивы, то вы можете:

  • передайте строковое представление массива (которое ваша хранимая процедура затем может преобразовать в массив - см. string_to_array)

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

    тогда

    SELECT my_method(:1)
    

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

  • полагайтесь на сам Postgres для преобразования строки в массив

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

    тогда

    SELECT my_method('{1,2,3,4}')
    
  • выберите не использовать переменные привязки и вместо этого выдайте явную командную строку со всеми прописанными параметрами (обязательно проверяйте или экранируйте все параметры, поступающие извне, чтобы избежать атак с использованием SQL-инъекций).

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

    тогда

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

Другие советы

Я понимаю, что это старый вопрос, но мне потребовалось несколько часов, чтобы найти хорошее решение, и я подумал, что передам то, что я узнал здесь и избавь кого-нибудь еще от хлопот.Попробуйте, например,

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

где @id_list привязан к параметру int[] посредством

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

где command - это NpgsqlCommand (с использованием C # и Npgsql в Visual Studio).

Ты можешь всегда используйте правильно отформатированную строку.Хитрость заключается в форматировании.

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

Обратите внимание, что если ваш массив представляет собой массив строк, то вам нужно будет использовать array.Выберите (значение => строка.Форматируйте("\"{0}\", значение)) или эквивалент.Я использую этот стиль для массива перечисляемого типа в PostgreSQL, потому что автоматического преобразования из массива нет.

В моем случае мой перечисляемый тип имеет некоторые значения, такие как 'value1', 'value2', 'value3', и мое перечисление C # имеет соответствующие значения.В моем случае конечный SQL-запрос в конечном итоге выглядит примерно так (E'{"value1", "value2"}'), и это работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top