如何用 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)。
我正在学习 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)。