代码之家  ›  专栏  ›  技术社区  ›  My Other Me

postgres函数(通过npgsql)调用executenonquery返回-1作为受影响行的结果

  •  0
  • My Other Me  · 技术社区  · 14 年前

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

    当我通过command对象上的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);
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   mnencia    14 年前

    我没有使用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
  •  -1
  •   rabin    14 年前

    要使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(),则应获得插入的行数。