我有一个简单的函数,它只是将提供给它的参数值插入到表的列中。
当我通过ExecuteNonQuery()方法在命令对象上运行函数时,总是得到-1,即使插入发生了。
如果我运行相同的查询作为一个文本命令,它给出的是正确的结果1。
我是postgresql/npgsql的新手。有什么诀窍可以让函数反馈受影响的行数吗?比如SQL Server中的“set nocount off”?
**EDIT:**我正在使用的代码:(使用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);
}
}
3条答案
按热度按时间bxgwgixi1#
我没有使用过Npgsql,但文档中有一个包含以下代码的示例:
如果你正在谈论像这样的PostgreSQL函数:
并且您正在执行
SELECT myinsert(1);
之类的操作,则无法获得受影响的行数,因为您正在运行SELECT,而函数内部执行的操作对您来说是不透明的。ozxc1zmp2#
要使ExecuteNonQuery()获取受影响的行数,postgresql函数应该只返回该值。例如:
现在,如果从代码中调用ExecuteNonQuery(),则应该获得插入的行数。
chhkpiq43#
以下是我如何实施的,它对我的工作没有任何问题:
将
OUT
参数添加到函数中。现在在C#方面
PS:我尝试了
ExecuteNonQuery()
方法,但它总是为我返回-1
(好像没有行受到NpgsqlDocumentation的影响)。使用上述方法,我能够从PostgreSQL函数中捕获受影响的行数,并使用OUT
参数,很容易在客户端捕获受影响的行。