我正在后端使用Oracle 11g开发一个ASP.NET Web应用程序。我编写了一个单独的SP,用于从数据库表中获取用户登录数据和标志。请在FetchUserLoginData()方法中找到以下代码片段:
String spName = "FETCH_USER_LOGIN_ROLE_DATA";
OracleCommand dbCheckLogin=new OracleCommand();
OracleDataReader LoginDataReader=null;
dbCheckLogin = dbCon.GetDBCommand(spName,dbCheckLogin);
dbCheckLogin.Parameters.Add(new OracleParameter("USERID", LoginID));
dbCheckLogin.Parameters.Add(new OracleParameter("USERPWD", Password));
dbCheckLogin.Parameters.Add(new OracleParameter("USERGUI_ID", OracleType.VarChar,2000)).Direction = ParameterDirection.Output;
dbCheckLogin.Parameters.Add(new OracleParameter("ADMIN_FLG", OracleType.VarChar,20)).Direction = ParameterDirection.Output;
dbCheckLogin.Parameters.Add(new OracleParameter("CLOSED_FLG", OracleType.VarChar,20)).Direction = ParameterDirection.Output;
dbCheckLogin.Parameters.Add(new OracleParameter("LOCKED_FLG", OracleType.VarChar,20)).Direction = ParameterDirection.Output;
dbCheckLogin.Parameters.Add(new OracleParameter("LOGGEDIN_FLG", OracleType.VarChar,20)).Direction = ParameterDirection.Output;
dbCheckLogin.Parameters.Add(new OracleParameter("USER_FLG", OracleType.VarChar,20)).Direction = ParameterDirection.Output;
dbCheckLogin.Parameters.Add(new OracleParameter("SEASED_FLG", OracleType.VarChar,20)).Direction = ParameterDirection.Output;
LoginDataReader = dbCheckLogin.ExecuteReader();
while (LoginDataReader.Read())
{
user.USER_SL = Convert.ToString(LoginDataReader["USER_SL"]);
user.ISADMIN=LoginDataReader["ISADMIN"].ToString();
user.ISCLOSED = LoginDataReader["ISCLOSED"].ToString();
user.ISLOCKED = LoginDataReader["ISLOCKED"].ToString();
user.ISLOGGEDIN = LoginDataReader["ISLOGGEDIN"].ToString();
user.ISPOWERUSER = LoginDataReader["ISPOWERUSER"].ToString();
user.ISSEASED= LoginDataReader["ISSEASED"].ToString();
}
现在的问题是,当我尝试在没有任何SP的情况下运行时,只需编写并执行直接查询,就没有问题,它可以很好地从数据库中获取数据。在SP的情况下,我有一个例外:没有找到数据。我每次都给出一个正确的用户名和密码,但仍然无法获取任何数据。即使我试图从SQLDeveloper或PL / SQL运行该过程,但没有发现任何问题。问题只出在我尝试从服务器端编码执行SP时。
答案 0 :(得分:0)
对我有用的是添加从SP返回的引用光标。 SP出现问题,现在我明白了。在没有返回游标的情况下,DataTable,DataSet,DataReader,DataAdapters都不会从SP获取任何数据,即使它应该这样做。如果对他人有任何帮助,我会在这里给出我的完整SP。
CREATE OR REPLACE PROCEDURE FETCH_USER_LOGIN_ROLE_DATA
(
USERID IN VARCHAR2
,USERPWD IN VARCHAR2
,OUT_CURSR OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN OUT_CURSR FOR
SELECT
U.ROWID,U.USER_SL,U.ISADMIN,U.ISPOWERUSER,
U.ISLOCKED,U.ISCLOSED,U.ISSEASED,U.ISLOGGEDIN
FROM USERS U
WHERE U.USER_ID=USERID AND
U.USER_PWD=USERPWD;
END FETCH_USER_LOGIN_ROLE_DATA;