Как предоставить Npgsql пользовательский тип данных в качестве параметра? - PullRequest
1 голос
/ 12 января 2012

Я хочу передать массив пар ключ-значение в качестве аргумента функции 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?Это поддерживается?Я не могу найти ссылку в Интернете.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 12 января 2012

Джереми!

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

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

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

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

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

0 голосов
/ 05 сентября 2016

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. Я не пробовал вызывать функцию, которая принимает пользовательский тип, но она должна работать так же, как указано выше См. this для некоторых примеров.

0 голосов
/ 15 января 2014

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

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

0 голосов
/ 28 июня 2012

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

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