如何用 Npgsql 和 PostgreSQL 做一个 out 参数?

How to do an out parameter with Npgsql and PostgreSQL?

我正在学习 Npgsql 和 PostgreSQL。我无法正确定义输出参数。我做错了什么?

函数如下:

CREATE OR REPLACE FUNCTION Insert_Customer_WithOutputParameter(
    IN _FirstName character varying DEFAULT NULL::character varying,
    IN _LastName character varying DEFAULT NULL::character varying,
    OUT _CustomerID integer)
  RETURNS integer as
$BODY$
BEGIN
INSERT INTO Customers (FirstName, LastName) VALUES (_FirstName, _LastName);

SELECT _CustomerID = lastval();

END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

代码如下:

[Test]
public void ExecuteNonQuerySproc()
{
    NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password");
    conn.Open();
    IDbCommand command = conn.CreateCommand();
    command.CommandText = "Insert_Customer_WithOutputParameter";
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add(new NpgsqlParameter("@FirstName", "John"));
    command.Parameters.Add(new NpgsqlParameter("@LastName", "Smith"));
    NpgsqlParameter outParm = new NpgsqlParameter("@CustomerID", NpgsqlDbType.Integer)
    {
        Direction = ParameterDirection.Output
    };
    command.Parameters.Add(outParm);

    command.ExecuteNonQuery();            
    conn.Close();
    Console.WriteLine(outParm.Value);
}

这是我收到的错误消息: Npgsql.NpgsqlException:错误:42601:查询没有结果数据的目的地

以下无效:

SELECT _CustomerID = lastval();

将其替换为简单的:

_CustomerID = lastval();

请注意,Npgsql 当前仅按位置 绑定参数,而不是按名称。这意味着您在 NpgsqlParameter 实例中给出的名称没有任何意义 - 它们的添加顺序必须与函数的声明相对应。 Npgsql 3.1 将支持函数参数的命名绑定(参见 this issue)。