0

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

4

1 回答 1

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;
于 2013-05-30T00:47:24.567 回答