0

我有一个简单的函数,它只是将提供给它的参数值插入到表中的列中。

当我通过命令对象上的 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);
    }
}
4

2 回答 2

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 并且该函数在内部执行的操作对您来说是不透明的。

于 2010-10-22T14:26:55.203 回答
-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(),您应该获得插入的行数。

于 2010-11-17T20:32:38.547 回答