【问题标题】:calling oracle stored procedure from asp.net application从 asp.net 应用程序调用 oracle 存储过程
【发布时间】:2011-06-08 07:39:20
【问题描述】:

在我的 asp.net 应用程序中,我正在调用存储过程 (oracle) 从数据库中获取一些值。

下面是sp:

create or replace PROCEDURE GetUserData(

--SQLWAYS_EVAL# ARCHAR(100)
UserName  IN NVARCHAR2, v_refcur OUT SYS_REFCURSOR)
   as
BEGIN
   BEGIN --SQLWAYS_EVAL# =@Password;
      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。

【问题讨论】:

  • 您使用什么提供商连接到 Oracle?您使用的是 ODP.net 还是 System.Data.OracleClient 命名空间?

标签: asp.net oracle stored-procedures


【解决方案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
        }
     }
  }
}

【讨论】:

    【解决方案2】:

    Microsoft Enterprise Library 简化了 Oracle 存储过程的发现和绑定。在业务对象和 Oracle 数据库之间构建数据访问层并不难。我现在更喜欢像 DevExpress 的 XPO 这样的 ORM 工具,它在最新版本中支持调用存储过程。但是,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;
          }
       }
     }
    

    如果您只希望从过程中返回一行,那么您可以返回列表中的第一项(如果存在)等。

    【讨论】:

    • EntLib 在这里有一个“隐藏”功能。如果您的 OUT SYSREFCURSOR 参数名为 cur_out,则此代码将在不调用 DiscoverParameters 的情况下运行。
    猜你喜欢
    • 2020-11-15
    • 2016-04-05
    • 2011-03-21
    • 2019-08-26
    • 1970-01-01
    • 2011-04-25
    • 2015-05-22
    • 2012-01-27
    • 2017-05-21
    相关资源
    最近更新 更多