如何使用 Npgsql 和 PostgreSQL 执行 ExecuteScalar 函数?
How to do ExecuteScalar Function with Npgsql and PostgreSQL?
我正在学习 Npgsql 和 PostgrSQL。我无法让这个简单的测试工作。这是我的功能:
CREATE OR REPLACE FUNCTION count_customers(_customerid integer DEFAULT NULL::integer)
RETURNS void AS
$BODY$
BEGIN
SELECT COUNT(*) FROM Customers
WHERE CustomerId = _customerid or _customerid is null;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
这是我的 C# 代码:
[Test]
public void ExecuteScalarTest()
{
NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password");
conn.Open();
IDbCommand command = conn.CreateCommand();
command.CommandText = "count_customers";
command.CommandType = CommandType.StoredProcedure;
object result = command.ExecuteScalar();
conn.Close();
Console.WriteLine(result);
}
我一直收到以下错误。
Npgsql.NpgsqlException:错误:42601:查询没有结果数据的目的地
这与 nPgSQL 无关。您的问题出在您的存储函数中。
您在 PL/PgSQL 中编写了一个简单的包装器,但您没有使用 RETURN
。您不能在 PL/PgSQL 中使用 SELECT
,除非它的输出转到变量(通过 SELECT INTO
或作为 x := (SELECT ...)
之类的子查询或 RETURN QUERY
语句.
你应该写:
BEGIN
RETURN QUERY
SELECT COUNT(*) FROM Customers
WHERE CustomerId = _customerid
OR _customerid is null;
END
并将您的过程定义为 RETURNS bigint
,因为如果它 returns void
,您显然无法从函数中获取值。此外,此函数是 STABLE
而不是 VOLATILE
。如果你不确定,什么也别说。 COST
也是如此 - 除非你有充分的理由,否则请将其保留。
虽然这仍然过于复杂。您可以使用简单的 sql 函数来进行这样的调用,例如
CREATE OR REPLACE FUNCTION count_customers(_customerid integer DEFAULT NULL::integer)
RETURNS bigint LANGUAGE sql STABLE AS
$BODY$
SELECT COUNT(*) FROM Customers
WHERE CustomerId = OR is null;
$BODY$;
我正在学习 Npgsql 和 PostgrSQL。我无法让这个简单的测试工作。这是我的功能:
CREATE OR REPLACE FUNCTION count_customers(_customerid integer DEFAULT NULL::integer)
RETURNS void AS
$BODY$
BEGIN
SELECT COUNT(*) FROM Customers
WHERE CustomerId = _customerid or _customerid is null;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
这是我的 C# 代码:
[Test]
public void ExecuteScalarTest()
{
NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password");
conn.Open();
IDbCommand command = conn.CreateCommand();
command.CommandText = "count_customers";
command.CommandType = CommandType.StoredProcedure;
object result = command.ExecuteScalar();
conn.Close();
Console.WriteLine(result);
}
我一直收到以下错误。
Npgsql.NpgsqlException:错误:42601:查询没有结果数据的目的地
这与 nPgSQL 无关。您的问题出在您的存储函数中。
您在 PL/PgSQL 中编写了一个简单的包装器,但您没有使用 RETURN
。您不能在 PL/PgSQL 中使用 SELECT
,除非它的输出转到变量(通过 SELECT INTO
或作为 x := (SELECT ...)
之类的子查询或 RETURN QUERY
语句.
你应该写:
BEGIN
RETURN QUERY
SELECT COUNT(*) FROM Customers
WHERE CustomerId = _customerid
OR _customerid is null;
END
并将您的过程定义为 RETURNS bigint
,因为如果它 returns void
,您显然无法从函数中获取值。此外,此函数是 STABLE
而不是 VOLATILE
。如果你不确定,什么也别说。 COST
也是如此 - 除非你有充分的理由,否则请将其保留。
虽然这仍然过于复杂。您可以使用简单的 sql 函数来进行这样的调用,例如
CREATE OR REPLACE FUNCTION count_customers(_customerid integer DEFAULT NULL::integer)
RETURNS bigint LANGUAGE sql STABLE AS
$BODY$
SELECT COUNT(*) FROM Customers
WHERE CustomerId = OR is null;
$BODY$;