![](/img/trans.png)
[英]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.