对 ExecuteNonQuery 的 Postgres 函数(通过 npgsql)调用返回 -1 作为受影响行的结果
Posted
技术标签:
【中文标题】对 ExecuteNonQuery 的 Postgres 函数(通过 npgsql)调用返回 -1 作为受影响行的结果【英文标题】:Postgres function(via npgsql) call to ExecuteNonQuery returns -1 as result for rows affected 【发布时间】:2010-10-21 22:33:58 【问题描述】:我有一个简单的函数,它只是将提供给它的参数值插入到表的列中。
当我通过命令对象上的 ExecuteNonQuery() 方法运行函数时,即使插入发生,我总是得到 -1。
如果我运行与文本命令相同的查询,它给出的正确结果是 1。
我是 postgresql/npgsql 的新手。有没有技巧可以让函数反馈受影响的行数? SQL Server 中的“set nocount off”之类的东西?
编辑: 我正在使用的代码:(使用 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);
【问题讨论】:
This work for me: "How to return the result of a postgresql function in c#? Console output empty" 【参考方案1】:我没有使用过 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 并且该函数在内部执行的操作对您来说是不透明的。
【讨论】:
【参考方案2】:要让 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(),您应该会获得插入的行数。
【讨论】:
应该吗?是什么让你说它“应该”?您是否尝试过,或者您从经验中知道这一点? 我使用过(正在使用)类似的功能。我没有测试这个特定的代码,因此“应该”。 我刚刚用 npgsql 2.0.11 测试了这个。没运气。 ExecuteNonQuery 的结果仍然是 -1。 ;( 我要去看看这个。你介意填写一份关于此的错误报告吗?提前致谢。以上是关于对 ExecuteNonQuery 的 Postgres 函数(通过 npgsql)调用返回 -1 作为受影响行的结果的主要内容,如果未能解决你的问题,请参考以下文章