Функция Postgres (через npgsql) при вызове ExecuteNonQuery возвращает -1 как результат для затронутых строк - PullRequest
0 голосов
/ 22 октября 2010

У меня есть простая функция, которая просто вставляет значения параметров, предоставленные ей, в столбцы таблицы.

Когда я запускаю функцию через метод ExecuteNonQuery () на объекте команды, я всегда получаю -1,даже если вставка произошла.

Если я выполняю тот же запрос, что и текстовая команда, это дает правильный результат 1.

Я новичок в postgresql / npgsql.Есть ли хитрость, чтобы функция возвращала количество затронутых строк?Что-то вроде «отключить nocount» в SQL Server?

РЕДАКТИРОВАТЬ: Код, который я использую: (с npgsql 2.0.11)

var connStr = @"Server=127.0.0.1;Port=5432;User Id=postgres;Password=***;Database=Test;";
using (var conn = new NpgsqlConnection(connStr)) {
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "insert_something";
        cmd.CommandType = CommandType.StoredProcedure;
        NpgsqlCommandBuilder.DeriveParameters(cmd);
        cmd.Parameters["_id"].Value = 1;
        cmd.Parameters["_val"].Value = 2;
        var rowsAffected = cmd.ExecuteNonQuery();
        Console.WriteLine(rowsAffected);
    }
}

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Я не использовал Npgsql, но в документации есть пример с следующий код:

NpgsqlCommand command = new NpgsqlCommand("insert into table1 values(1, 1)", conn);
Int32 rowsaffected;

try
{
    rowsaffected = command.ExecuteNonQuery();
}

Если вы говорите о какой-то функции PostgreSQL, например:

CREATE FUNCTION myinsert(integer) RETURNS void
LANGUAGE 'sql' AS 'INSERT INTO mytable VALUES ($1)';

и вы делаете что-то вроде SELECT myinsert(1);, вы не можете получить количество затронутых строк, потому что вы запускаете SELECT и то, что внутренняя функция делает вас непрозрачным.

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

Чтобы ExecuteNonQuery () мог получить количество затронутых строк, ваша функция postgresql должна возвращать именно это.Примером может быть:

CREATE OR REPLACE FUNCTION insert_something(_id int, _val int)
RETURNS int as $$
DECLARE count int;
BEGIN
    INSERT INTO some_table (id, value) VALUES(_id, _val);
    GET DIAGNOSTICS count = ROW_COUNT;
    RETURN count;
END;
$$ language plpgsql;

Теперь, если вы вызываете ExecuteNonQuery () из своего кода, вы должны получить количество вставленных строк.

...