将npgsql模块与Microsoft .Net一起使用,如何获取PostgreSQL函数的返回值?不是命名参数或引用游标的值,而是RETURNed单个字符串/数字值?
谢谢!
马丁
答案 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();
谢谢!
马丁