为什么ORA-01403:找不到数据错误

时间:2013-05-27 17:13:05

标签: c# oracle

我正在后端使用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时。

1 个答案:

答案 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;