2015-08-24 1 views
1

Я изучаю Npgsql и PostgreSQL. Я не могу правильно определить выходной параметр. Что я делаю не так?Как сделать параметр out с помощью 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: запрос имеет нет адресата для данных результата

+1

Смотрите следующее: http://stackoverflow.com/questions/2085421/error-query-has-no-destination-for-result-data Не удалось проверить, но возможно: _SELECT lastval() INTO _CustomerID_? – Steve

ответ

1

Следующая лань sn't работа:

SELECT _CustomerID = lastval(); 

Замените его простой:

_CustomerID = lastval(); 

Обратите внимание, что в настоящее время Npgsql связывает параметры положением только и не по имени. Это означает, что имена, которые вы даете в экземплярах NpgsqlParameter, ничего не значат - их порядок добавления должен соответствовать объявлению функции. Npgsql 3.1 будет поддерживать именованное связывание аргументов функции (см. this issue).

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

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