[英]Proper way to run PsList.exe from my C# app and get its output (Or why my code doesn't work)?
[英]Why doesn't my C# code get a return value from my Oracle function?
我试图检查用户是否在我的数据库中,我的函数的返回值是't'或'f'。 如下:
CREATE OR REPLACE FUNCTION LOGIN
(p_Naam in varchar2
,p_Wachtwoord in varchar2)
return varchar2
is
v_count number;
BEGIN
select count(*) into v_count
from Lid
where Naam = p_Naam
and Wachtwoord = p_Wachtwoord;
if v_count > 0 then
return 't';
end if;
return 'f';
END LOGIN;
现在我使用我的C#代码调用此函数,如下所示:
public bool LogIn(string gebruikersnaam, string wachtwoord)
{
string s;
var cmd = new OracleCommand
{
Connection = conn,
CommandText = "Login",
CommandType = CommandType.StoredProcedure
};
cmd.Parameters.Add("p_Naam", OracleDbType.Varchar2).Value = gebruikersnaam;
cmd.Parameters.Add("p_Wachtwoord", OracleDbType.Varchar2).Value = wachtwoord;
cmd.Parameters.Add("return_value", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
try
{
conn.Open();
cmd.ExecuteNonQuery();
s = cmd.Parameters["return_value"].Value.ToString();
}
finally
{
conn.Close();
}
return s == "t";
}
当我在我的oracle开发人员中尝试这个功能时,我得到一个输出。 只有在我的C#代码中,s总是出现为“”
在我的sql开发人员中,以下内容给了我''
BEGIN
dbms_output.put_line(LOGIN('Willem Koonings', 'willem'));
END;
我暂时没有使用OracleCommands,但我建议这样做:
CommandText = "Login(:p_Naam, :p_Wachtwoord)";
我下注的长解决方案(虽然改变类型为文本):
CommandText = "select Login(:p_Naam, :p_Wachtwoord) return_value from dual";
在代码中有这个:
s = cmd.Parameters["return_value"].Value.ToString();
对我来说,这意味着你的命令有一些类似于此的想法:
insert into test (user_name, create_date)
values (:USERNAME, sysdate)
returning user_id into :return_value
我从未见过存储过程使用“返回”。 这并不意味着它无法完成,但它似乎与我使用它并看到它使用的方式不一致。
由于您正在运行一个返回标量值的存储过程,这可能更适合您:
string result = (string)cmd.ExecuteScalar();
您需要首先在索引中放置“返回值”参数,据我所知,通过使用Oracle,它不会将参数的名称传递给Oracle调用,它是绝对的放置。
希望这能解决你的问题:)
大教堂
ParameterDirection.ReturnValue
只能返回一个数值,而不能返回字符串或单个char。
(至少在Sql Server中)。 尝试更改函数以返回整数和参数集合以接收整数。 (我没有Oracle测试,如果有一些语法错误,请纠正我)
CREATE OR REPLACE FUNCTION LOGIN
(p_Naam in varchar2
,p_Wachtwoord in varchar2)
return INTEGER
is
v_count number;
BEGIN
select count(*) into v_count
from Lid
where Naam = p_Naam
and Wachtwoord = p_Wachtwoord;
if v_count > 0 then
return 1;
end if;
return 0;
END LOGIN;
....
cmd.Parameters.Add("p_Naam", OracleDbType.Varchar2).Value = gebruikersnaam;
cmd.Parameters.Add("p_Wachtwoord", OracleDbType.Varchar2).Value = wachtwoord;
cmd.Parameters.Add("return_value", OracleDbType.Int32, ParameterDirection.ReturnValue);
....
int result = Convert.ToInt32(cmd.Parameters["return_value"].Value);
if(result == 0)
// fail
else
// success...
而不是'返回'语句为什么不声明一个out参数。让我知道如果我不清楚
刚刚发现并测试了VS2017社区版+ 11g。
OracleCommand chkCmd = null;
try
{
chkCmd = new OracleCommand();
chkCmd.CommandText = "login";
chkCmd.CommandType = CommandType.StoredProcedure;
chkCmd.Connection = conn;
OracleParameter mobParam1 = new OracleParameter("p_Naam", OracleDbType.Varchar2, 2000);
mobParam1.Direction = ParameterDirection.Input;
mobParam1.Value = gebruikersnaam;
OracleParameter mobParam2 = new OracleParameter("p_Wachtwoord", OracleDbType.Varchar2, 2000);
mobParam2.Direction = ParameterDirection.Input;
mobParam2.Value = wachtwoord;
OracleParameter retValue = new OracleParameter("returnVal", OracleDbType.Varchar2, 2000);
retValue.Direction = ParameterDirection.ReturnValue;
chkCmd.Parameters.Clear();
chkCmd.Parameters.Add(retValue);
chkCmd.Parameters.Add(mobParam1);
chkCmd.Parameters.Add(mobParam2);
con.Open();
chkCmd.ExecuteScalar();
string retmsg = Convert.ToString(retValue.Value);
return retmsg=="t";
}
finally
{
con.Close();
chkCmd.Dispose();
con.Dispose();
}
使Return_Value
您的第一个参数:
cmd.Parameters.Add("Return_Value", OracleDbType.Boolean, ParameterDirection.ReturnValue);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.