Чтобы обновить несколько строк с помощью хранимой процедуры в Postgres - PullRequest
0 голосов
/ 16 ноября 2018

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

Также хотелось бы знать, как вызывать этот столбец.процедура в c #?

Вот формат данных:

[
    { col1: a, col2: 5, col3: 1, col4: one},
    { col1: b, col2: 6, col3: 2, col4: two},
    { col1: c, col2: 7, col3: 3, col4: three},
    { col1: d, col2: 8, col3: 4, col4: four},
]  

Вот мой ожидаемый результат:

 col1   (varchar)| col2 (integer) |   col3 (integer)   |   col4 (varchar)
-----------------+----------------+--------------------+------------------
    a            |  5             |     1              |    one
    b            |  6             |     2              |    two
    c            |  7             |     3              |    three
    d            |  8             |     4              |    four   

 I am passing the data format as array in stored procedure.
    But want to know, how to cal the SP from c#?


The stored procedure I have written is:  

CREATE OR REPLACE FUNCTION dbo.sp_insertorupdatereadings(d dbo.reading[])
  RETURNS boolean AS
$BODY$
DECLARE

begin
--Update min values
update dbo.reading set 
  p7_1_5_1_0_first =subquery.p7_1_5_1_0_first,
  p7_1_5_1_0_last =subquery.p7_1_5_1_0_last,
  p7_1_5_2_0_first=subquery.p7_1_5_2_0_first,
  p7_1_5_2_0_last=subquery.p7_1_5_2_0_last
  From (select * from unnest(d)) as subquery
  where dbo.reading.p7_1_5_1_0_first= subquery.p7_1_5_1_0_first;

-- insert new records
  insert into dbo.reading 
select * from unnest(d) as inserd where (id) not in (select id from dbo.reading);
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION dbo.reading(dbo.reading[])
  OWNER TO postgres;

1 Ответ

0 голосов
/ 17 ноября 2018

Было бы очень полезно реально увидеть хранимую процедуру и любые соответствующие объекты .NET, поэтому большинство советов, которые я могу предложить, являются лишь условными.

В отличие от других адаптеров ADO, использующих CommandTypeСвойство объекта команды, для NpgSql / PostgreSQL, вы можете просто вызвать хранимую процедуру с помощью команды select:

using (NpgsqlCommand cmd = new NpgsqlCommand("select my_stored_proc()", conn))
{
    cmd.ExecuteNonQuery();
}

Если у вас есть параметры, они следуют тому же шаблону, что и любая другая команда (select, insert,обновление):

using (NpgsqlCommand cmd = new NpgsqlCommand("select my_stored_proc(:P1, :P2)", conn))
{
    cmd.Parameters.AddWithValue("P1", "foo");
    cmd.Parameters.AddWithValue("P2", 3.14);
    cmd.ExecuteNonQuery();
}

Вы упомянули, что ваш параметр был массивом ... но я не думаю, что вы можете иметь массив смешанных типов данных Postgres, не так ли?Конечно, в C # вы можете иметь массив объектов, но я не думаю, что это переводит чисто в массив PostgreSQL.

Вот пример параметра с массивом, использующего массив целых чисел:

cmd.Parameters.Add(new NpgsqlParameter("NUMS", NpgsqlTypes.NpgsqlDbType.Array |
    NpgsqlTypes.NpgsqlDbType.Integer));
cmd.Parameters[0].Value = new int[3] { 1, 2, 3};

Если вы можете добавить некоторые детали к вашему вопросу, возможно, я смогу сформулировать ответ лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...