如何使用npgsql从PG / SQL函数获取返回值

时间:2016-05-03 18:22:59

标签: postgresql npgsql

将npgsql模块与Microsoft .Net一起使用,如何获取PostgreSQL函数的返回值?不是命名参数或引用游标的值,而是RETURNed单个字符串/数字值?

谢谢!

马丁

1 个答案:

答案 0 :(得分:0)

所以,我有一个PL / pgSQL函数声明如下(我使用的是EnterpriseDB [版本9.5],我不确定这在vanilla 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();

谢谢!

马丁