Как предоставить Npgsql пользовательский тип данных в качестве параметра?

Я хочу передать массив пар ключ-значение в качестве аргумента функции PostgreSQL, используя Npgsql. У меня определен следующий тип:

drop type if exists key_value_pair
create type key_value_pair as (
    k varchar(250),
    v text
    );

Я хочу написать такую ​​функцию:

create or replace function persist_profile(
    _user_id integer,
    _key_value_pairs key_value_pair[]
    ) returns boolean as $$
begin;

...

return true;
end;
$$ language plpgsql;

Как мне передать данные из объекта IDictionary<string, string> в хранимую процедуру с помощью Npgsql? Это поддерживается? Не могу найти ссылку в сети.

Спасибо!


person Jeremy Holovacs    schedule 12.01.2012    source источник


Ответы (4)


Джереми!

К сожалению, Npgsql пока не поддерживает пользовательские типы данных. У меня есть намерение добавить поддержку для этого.

Это означало бы добавить некоторый тип «регистрации» преобразователей типов с помощью Npgsql. Таким образом, ваше приложение зарегистрирует преобразователь для вашего пользовательского типа, и Npgsql будет использовать его для отправки данных туда и обратно.

Более подробную информацию можно получить в: Npgsql/src/NpgsqlTypes/NpgsqlTypeConverters.cs на cvs.npgsql.org

Пожалуйста, добавьте запрос функции об этом на нашем сайте проекта: project.npgsql.org.

Заранее спасибо.

person Francisco Junior    schedule 12.01.2012
comment
Иногда у pgfoundry возникают проблемы. Пожалуйста, попробуйте еще раз, и это должно сработать. Я только что проверил это здесь сейчас, и все было в порядке. - person Francisco Junior; 15.01.2012
comment
Код Npgsql можно найти на github: github.com/npgsql/Npgsql. Надеюсь, это поможет. - person Francisco Junior; 08.05.2014

Я преобразовываю IDictionary в двумерный массив и передаю этот массив в хранимую процедуру через Npgsql - отлично работает как Npgsql поддерживает массивы в качестве параметров. Преобразовать так:

                string[][] columnsArray = new string[2][];
                Dictionary<string, string> fields = ...
                columnsArray[0] = fields.Keys.ToArray();
                columnsArray[1] = fields.Values.ToArray();
person Aleksey Kontsevich    schedule 28.06.2012

Кажется, он по-прежнему не поддерживает пользовательские типы объектов. Альтернативный способ - сериализовать объект в XML и передать в качестве параметра, а также проанализировать и выполнить его в хранимой процедуре.

Есть ли какие-либо изменения в статусе поддержки для пользовательских объектов?

person dgunseli    schedule 15.01.2014
comment
К сожалению, у нас по-прежнему нет поддержки пользовательских типов :( Но я начал писать документацию о том, как это сделать: github.com/npgsql/Npgsql/wiki/ Это очень ранняя версия, но она дает вам некоторые подсказки о том, с чего начать работу. Код Npgsql. Надеюсь, это поможет. Пожалуйста, проверьте его и дайте мне знать, что вы думаете. - person Francisco Junior; 08.05.2014

Npg поддерживает его (по крайней мере, в 3.1.7)

Скажем, вы выполняете что-то вроде

INSERT INTO some_table (key, value) SELECT key, value FROM UNNEST(@key_value_pairs);

где key_value_pairs — это массив вашего типа key_value_pair, и у вас есть класс вроде

class key_value_pair
{
    string key;
    string value;
}

и у вас есть массив этих объектов

key_value_pair[] params = {...};

затем вы добавляете параметры в команду, например

using (NpgsqlCommand cmd = new NpgsqlCommand())
{
    ...
    cmd.Parameters.Add("key_value_pairs", NpgsqlDbType.Array | NpgsqlDbType.Composite).Value = params;
    cmd.ExecuteNonQuery();
}

Ключевым моментом здесь является установка типа параметра на NpgsqlDbType.Array | NpgsqlDbType.Composite. Я не пробовал вызывать функцию, которая принимает определенный пользователем тип, но она должна работать так же, как и выше. См. это для некоторых примеров.

person ubi    schedule 05.09.2016