簡體   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