繁体   English   中英

为什么我的C#代码不能从我的Oracle函数中获得返回值?

[英]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测试,如果有一些语法错误,请纠正我)

请参阅此参考(适用于Sql Server)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM