Postgres 函数(通过 npgsql)调用 ExecuteNonQuery 返回 -1 作为受影响行的结果
我有一个简单的函数,只需将提供给它的参数值插入到表中的列中。
当我通过命令对象上的 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);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我没有使用过 Npgsql,但文档中有一个示例
下面的代码:
如果您正在谈论像这样的某些 PostgreSQL 函数:
并且您正在执行类似
SELECT myinsert(1);
的操作,则无法获取受影响的行数,因为您正在运行SELECT 以及该函数内部执行的操作对您来说是不透明的。I haven't used Npgsql, but the documentation has an example with
the following code:
If you are talking about some PostgreSQL function like this:
and you are doing something like
SELECT myinsert(1);
, you can't get the number of affected rows, because you are running a SELECT and what the function does internally is opaque to you.为了让 ExecuteNonQuery() 获取受影响的行数,您的 postgresql 函数应该返回该值。一个例子是:
现在,如果您从代码中调用 ExecuteNonQuery(),您应该获得插入的行数。
For ExecuteNonQuery() to get the number of rows affected, your postgresql function should return just that. An example would be:
Now if you call ExecuteNonQuery() from your code, you should get the inserted rows count.
以下是我的实现方式,它对我来说没有任何问题:
向您的函数添加一个
OUT
参数。现在在 C# 方面
PS:我尝试了
ExecuteNonQuery()
方法,但它总是为我返回-1
(就好像没有行受到影响NpgsqlDocumentation)使用上述方式我能够捕获受 PostgreSQL 影响的行数函数和 OUT 参数可以很容易地在客户端捕获受影响的行。Here's how I have implemented and its working for me without any issues:
Add an
OUT
Parameter to your function.Now on the C# side
PS : I tried the just
ExecuteNonQuery()
approach but it was always returning-1
for me (as if no rows has been affected NpgsqlDocumentation) Using above way I was able to capture the Number of rows affected from the PostgreSQL function and withOUT
parameter it was easy to catch the affected rows on the client side.