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 に答える