2016-05-03 6 views
0

Wie bekomme ich mit dem npgsql-Modul mit Microsoft .Net den Rückgabewert einer PostgreSQL-Funktion? Nicht der Wert eines benannten Parameters oder eines ref-Cursors, sondern ein zurückgegebener einzelner String-/Zahlenwert?So erhalten Sie den Rückgabewert der PG/SQL-Funktion mit npgsql

danke!

Martin

+0

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')' –

Antwort

0

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

Verwandte Themen