вызов хранимой процедуры оракула из приложения asp.net - PullRequest
1 голос
/ 13 января 2011

в моем приложении 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# =@Password;
      open v_refcur for SELECT  StaffId,
                UserName,
                Password,
                Pin,
                LastUpdateId,
                LastUpdateDate,
                FullName,
                PinFailedAttempts,
                PinFailedDate
      FROM UserData
      WHERE UserName = UserName;


   END;

   RETURN; 
END;

Может кто-нибудь помочь мне, как вызвать этот sp из моего кода asp.net.

Ответы [ 2 ]

1 голос
/ 13 января 2011

Библиотека Microsoft Enterprise упрощает обнаружение и привязку хранимых процедур Oracle.Нетрудно построить уровень доступа к данным между вашими бизнес-объектами и базой данных Oracle.Сейчас я больше поклонник инструментов ORM, таких как XPO DevExpress, который в последней версии поддерживает вызов хранимых процедур.Однако 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;
      }
   }
 }

Если вы ожидаете, что из процедуры будет возвращена только одна строка, вы можете вернуть первый элемент в списке, если он есть, и т. Д.1004 *

1 голос
/ 13 января 2011

Используя 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
        }
     }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...