我有一个简单的函数,只需将提供给它的参数值插入表中的列。
当我通过命令对象上的ExecuteNonQuery()方法运行该函数时,我总是得到-1,即使插入发生了。
如果我运行与Text命令相同的查询,则它会得到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);
}
}
答案 0 :(得分: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以及该函数内部对您不透明的内容。
答案 1 :(得分:-1)
对于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(),则应该获得插入的行数。