Kri*_*eto 5 c# oracle ado.net plsql
我有这个pl/sql函数,它唯一做的就是验证用户是否存在于数据库中,如果用户存在,则返回"Y",但如果用户不存在,则返回"N",我想要的是获取我在c#中的pl/sql中返回的值.
我正在使用oracle 10g
CREATE OR REPLACE FUNCTION KRIST.f_Login (userName IN VARCHAR2,
password IN VARCHAR2)
RETURN VARCHAR2
IS
CURSOR USERFINDER IS
SELECT IdEmpleado
FROM EMPLEADO
WHERE Usuario=userName
AND Clave=password;
id number;
returnVal VARCHAR2(1);
BEGIN
OPEN USERFINDER;
FETCH USERFINDER INTO id;
IF(id IS NULL) THEN
returnVal:='Y';
RETURN returnVal;
END IF;
returnVal:='N';
RETURN returnVal;
CLOSE USERFINDER;
END;
/
Run Code Online (Sandbox Code Playgroud)
我怎么能执行这个功能,并在变量中得到结果...我有thos代码,但不起作用
OracleCommand cmd = new OracleCommand("krist.p_login",conn);
cmd.CommandType = CommandType.StoredProcedure; // use StoredProcedure with Functions as well
OracleParameter returnVal = new OracleParameter("returnVal",null);
OracleParameter p_one = new OracleParameter("userName","kristian");
OracleParameter p_two = new OracleParameter("password", "kristian");
returnVal.OracleType = OracleType.VarChar;
returnVal.Size = 1;
p_one.OracleType = OracleType.VarChar;
p_two.OracleType = OracleType.VarChar;
p_one.DbType = DbType.String;
p_two.DbType = DbType.String;
returnVal.DbType = DbType.String;
returnVal.Direction = ParameterDirection.ReturnValue;
p_one.Direction = ParameterDirection.Input;
p_two.Direction = ParameterDirection.Input;
cmd.Parameters.Add(p_one);
cmd.Parameters.Add(p_two);
cmd.Parameters.Add(returnVal);
cmd.ExecuteNonQuery();
String bval = Convert.ToString(returnVal.Value);
return bval;
Run Code Online (Sandbox Code Playgroud)
以下代码适用于我.
注意:您的pl/sql代码称为函数KRIST.f_Login,但您的c#称为krist.p_login
NB2:您的pl/sql代码使用了Varchar2,但您的c#使用了varchar
NB3:我正在使用Oracle.DataAccess.dll
NB4:I假设您的返回值缓冲区大小可以是1,但尝试不同的大小.
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
int RETURN_VALUE_BUFFER_SIZE = 32767;
OracleCommand cmd = new OracleCommand();
try {
cmd.Connection = conn;
cmd.CommandText = "KRIST.f_Login";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("returnVal", OracleDbType.Varchar2, RETURN_VALUE_BUFFER_SIZE);
cmd.Parameters["returnVal"].Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add("userName", OracleDbType.Varchar2);
cmd.Parameters["userName"].Value = "kristian";
cmd.Parameters.Add("password", OracleDbType.Varchar2);
cmd.Parameters["password"].Value = "kristian";
cmd.ExecuteNonQuery();
string bval = cmd.Parameters["returnVal"].Value.ToString();
return bval;
} catch (Exception e) {
// deal with exception
} finally {
command.Dispose();
connection.Close();
connection.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
据我记得如果您使用 ODP.NET,您需要首先提供 retVal 参数。
ODP.NET 有问题,它不会将参数与提供的参数名称绑定,而是与参数的顺序绑定。
因此只需将顺序更改为:
cmd.Parameters.Add(returnVal);
cmd.Parameters.Add(p_one);
cmd.Parameters.Add(p_two);
Run Code Online (Sandbox Code Playgroud)
在我的资料中,我发现返回参数我称为“RETURN”(不确定它是否重要):
OracleParameter returnVal = new OracleParameter("RETURN",null);
Run Code Online (Sandbox Code Playgroud)
哈哈,还有一件事。它永远不会到达最后一行 - 因为 return 将终止执行。当您不再需要它时,请立即将其关闭。
RETURN returnVal;
CLOSE USERFINDER; --<<-- won't close this cursor
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23013 次 |
最近记录: |