2015-08-23 2 views
1

Я изучаю Npgsql и PostgrSQL. Я не могу заставить этот простой тест работать. Вот моя функция:Как выполнить функцию ExecuteScalar с помощью Npgsql и PostgreSQL?

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: запрос не имеет назначения для данных результата

+0

+1 спасибо за просмотр вашего кода и текст сообщения об ошибках. В будущем также рекомендуется использовать PostgreSQL. –

ответ

2

Это не имеет ничего общего с nPgSQL. Ваша проблема в вашей сохраненной функции.

Вы написали тривиальную обертку в PL/PgSQL, но вы не использовали RETURN. Вы не можете использовать SELECT в PL/PgSQL кроме случаев, когда его выход переходит в переменную (через SELECT INTO или подзапроса как x := (SELECT ...) или к RETURN QUERY заявления

Вы должны написать:.

BEGIN 
    RETURN QUERY 
    SELECT COUNT(*) FROM Customers 
    WHERE CustomerId = _customerid 
     OR _customerid is null; 
END 

и определить ваша процедура как RETURNS bigint, так как, очевидно, вы не можете получить значение из функции, если оно возвращает 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 = $1 OR $1 is null; 
$BODY$; 
+0

Спасибо, что сработал! –

 Смежные вопросы

  • Нет связанных вопросов^_^