Таким образом, я имел функцию PL/PgSQL объявленную следующим образом (я использую EnterpriseDB [версия 9.5], я не уверен, что это будет действительно в ванильным PostgreSQL):
FUNCTION f_auth_user (p_user_name IN VARCHAR2,
p_user_pwd IN VARCHAR2,
p_security_user_seq OUT NUMBER,
p_login_key OUT VARCHAR2,
p_psn_id OUT NUMBER,
p_message OUT VARCHAR2)
RETURN NUMBER;
Dotnet код, который назвал это выглядит следующим образом:
EDBCommand cmd = new EDBCommand("smcs.pkg_login.f_auth_user(:p_user_name, :p_user_pwd, :p_security_user_seq, :p_login_key, :p_psn_id, :p_message)", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("p_return_value", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add("p_user_name", EDBTypes.EDBDbType.Varchar2, 256).Value = txtUserName.Text.Trim().ToUpper();
cmd.Parameters.Add("p_user_pwd", EDBTypes.EDBDbType.Varchar2, 256).Value = txtPassword.Text.Trim().ToUpper();
cmd.Parameters.Add("p_security_user_seq", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_login_key", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_psn_id", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_message", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output;
Этот общий подход работал с Oracle, но это, кажется, что мне нужно переместить код, добавив параметр для Ретур п значение к концу списка параметров, поэтому моему рабочему коду, как это:
cmd.Parameters.Add("p_user_name", EDBTypes.EDBDbType.Varchar2, 256).Value = txtUserName.Text.Trim().ToUpper();
cmd.Parameters.Add("p_user_pwd", EDBTypes.EDBDbType.Varchar2, 256).Value = txtPassword.Text.Trim().ToUpper();
cmd.Parameters.Add("p_security_user_seq", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_login_key", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_psn_id", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output;
cmd.Parameters.Add("p_message", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output;
returnParam = new EDBParameter("p_return_value", EDBTypes.EDBDbType.Integer);
returnParam.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(returnParam);
Весьма вероятно, что я мог бы конденсироваться созданием и использование параметра p_return_value в 2 или 1 заявление, я гавань Я еще не пытался это сделать.
Затем я могу выполнить и получить результаты (включая возвращаемое значение), как это:
conn.Open();
cmd.Prepare();
cmd.ExecuteNonQuery();
sequence = Convert.ToInt32(cmd.Parameters["p_security_user_seq"].Value.ToString());
loginKey = Convert.ToString(cmd.Parameters["p_login_key"].Value.ToString());
message = Convert.ToString(cmd.Parameters["p_message"].Value.ToString());
authenticatedUser = Convert.ToString(cmd.Parameters["p_return_value"].Value.ToString());
conn.Close();
Спасибо!
Martin
Обратите внимание, что функции PostgreSQL не могут быть «выполнены», как хранимые процедуры в MySQL или SQLServer. Функция в PostgreSQL всегда должна быть выбрана, например. 'select myfunction ('foo', 'bar')' –