2011-01-13 26 views
1

,我調用存儲過程(oracle)從數據庫中獲取一些值。在我的asp.net應用程序中調用asp.net應用程序中的存儲過程

以下是SP:

create or replace PROCEDURE GetUserData(

--SQLWAYS_EVAL# ARCHAR(100) 
UserName IN NVARCHAR2, v_refcur OUT SYS_REFCURSOR) 
    as 
BEGIN 
    BEGIN --SQLWAYS_EVAL# [email protected]; 
     open v_refcur for SELECT StaffId, 
       UserName, 
       Password, 
       Pin, 
       LastUpdateId, 
       LastUpdateDate, 
       FullName, 
       PinFailedAttempts, 
       PinFailedDate 
     FROM UserData 
     WHERE UserName = UserName; 


    END; 

    RETURN; 
END; 

誰能幫助我如何從我的asp.net代碼中調用此SP。

+0

什麼提供商您使用的連接到Oracle返回的第一個項目?你在使用ODP.net還是System.Data.OracleClient命名空間? – InSane 2011-01-13 07:11:07

回答

1

使用ODP,你可以這樣做以下:

讓你的存儲過程,將用戶名參數,並返回一個指針的函數

create or replace FUNCTION GetUserData(UserName IN NVARCHAR2) RETURN SYS_REFCURSOR; 

然後

using (var connection = new OracleConnection(connectionString)) 
{ 
    using (var command = new OracleCommand("GetUserData", connection)) 
    { 
    command.CommandType = CommandType.StoredProcedure; 
    command.BindByName = true; 

    // Return value parameter has to be added first ! 
    var returnValueParameter = new OracleParameter(); 
    returnValueParameter.Direction = ParameterDirection.ReturnValue; 
    returnValueParameter.OracleDbType = ParameterDirection.RefCursor; 
    command.Parameters.Add(returnValueParameter); 

    var userNameParameter = command.Parameters.Add("UserName", userName); 
    returnValueParameter.Direction = ParameterDirection.In; 

    using (OracleDataReader reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // Read the current record's fields 
     } 
    } 
    } 
} 
1

Microsoft企業庫簡化了Oracle存儲過程的發現和綁定。在Business Objects和Oracle數據庫之間構建數據訪問層並不困難。現在,我更喜歡ORM工具的愛好者,比如DevExpress的XPO,它在最新版本中支持調用存儲過程。但是,Microsoft Entlib是免費的,而DevExpress則不是。

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Common; 
using Microsoft.Practices.EnterpriseLibrary.Data; 
using Your.BusinessObjects; 

namespace DataAccess 
{ 
    public class UserDataDAL 
    { 
     public static Database dataBase = DatabaseFactory.CreateDatabase(); ///< Use default connection string configured in web.config 

     public static List<UserInfo> GetData(string userName) 
     { 
     List<UserInfo> listOfUserInfo = new List<UserInfo>(); 
     UserInfo userInfo; 

     DbCommand cmd = dataBase.GetStoredProcCommand("SCHEMA.GETUSERDATA"); 
     dataBase.DiscoverParameters(cmd); 

     dataBase.SetParameterValue(cmd, "USERNAME", userName); 

     using (IDataReader dr = dataBase.ExecuteReader(cmd)) 
     { 

      while (dr.Read()) 
      { 
       userInfo = new UserInfo(); 

       userInfo.StaffId = dr["STAFFID"] != DBNull.Value ? Convert.ToInt32(dr["STAFFID"]) : 0; 
       userInfo.UserName = dr["USERNAME"] != DBNull.Value ? Convert.ToString(dr["USERNAME"]) : String.Empty; 
       userInfo.Password = dr["PASSWORD"] != DBNull.Value ? Convert.ToString(dr["PASSWORD"]) : String.Empty; 
       userInfo.LastUpdateId = Convert.ToInt32(dr["LASTUPDATEID"]); 
       userInfo.LastUpdateDate = dr["LASTUPDATEDATE"] != null ? Convert.ToDateTime(dr["LASTUPDATEDATE"]) : new DateTime(); 

       listOfUserInfo.Add(userInfo); 
      } 
     } 
     return listOfUserInfo; 
     } 
    } 
} 

如果你只指望從過程返回一行,那麼你可以在列表中如果存在等

+0

EntLib在這裏有一個'隱藏'功能。如果你的`OUT SYSREFCURSOR`參數被命名爲`cur_out`,這段代碼將不會調用`DiscoverParameters`。 – 2012-11-08 16:19:26

相關問題