So hatte ich eine PL/pgSQL-Funktion wie folgt deklariert (Ich bin mit EnterpriseDB [Version 9.5], ich bin nicht sicher, ob dies würde in Vanille PostgreSQL gültig):
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;
der dotNet Code, der es sah aus wie folgt aufgerufen:
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;
Dieser allgemeine Ansatz mit Oracle gearbeitet, aber es scheint, dass ich den Code bewegen müssen, um die Parameter für den Rückgabewert Hinzufügen bis zum Ende der Parameterliste, so ist mein Arbeits Code wie folgt:
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);
Es ist sehr wahrscheinlich, dass ich die Erstellung und Verwendung des p_return_value Parameters in 2 oder 1 Aussagen kondensiert haben könnte, ich habe nicht versuchte das schon.
dann kann ich ausführen und Abrufen von Ergebnissen (einschließlich der Rückgabewert) wie folgt aus:
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();
Dank!
Martin
Beachten Sie, dass PostgreSQL-Funktionen können nicht "ausgeführt" wie Stored Procedures in MySQL oder SQL Server werden. Eine Funktion in PostgreSQL muss immer ausgewählt werden, z. 'wähle meine Funktion ('foo', 'bar')' –