簡體   English   中英

在 Entity Framework Core 中執行 Oracle 存儲過程

[英]Execute Oracle stored procedure in Entity Framework Core

當我嘗試使用 Entity Framework Core 執行 Oracle 存儲過程時,出現以下異常:

找不到 CLR 類型“OracleParameter[] 到關系類型的映射

我嘗試了ExecuteSqlCommandFromSQL方法,兩者都會導致相同的異常。

Oracle 存儲過程代碼:

CREATE OR REPLACE Procedure GET_DEPT_PROC (
p_ParentSiteId number,
P_SiteId number,P_LoggedUserId number, P_curParam OUT sys_REFCURSOR) as
Begin
OPEN curParam FOR 
select 1 Id, 2 EntityAlmostOnRenewalTrans, 3 EntityVerifiedTrans, 4 
EntityCompletedTrans, 5 EntityClosedTrans, 6 MyVerifiedTrans, 7 
MyCreatedTrans, 8 MyDraftedTrans, 9 MyRejectedTrans FROM DUAL;

End;

C# 執行這個存儲過程的方法:

public virtual DashBoardData GetDashBoardData(short parentSiteId, short siteId, int loggedUserId)
{
     var parameters = new OracleParameter[]
            {                        
                    new OracleParameter("@p_ParentSiteId", parentSiteId),
                    new OracleParameter("@p_SiteId", siteId),
                    new OracleParameter("@p_LoggedUserId", loggedUserId),                        
                    new OracleParameter("@p_curParam", OracleDbType.RefCursor, ParameterDirection.Output)};

     string sql = "EXEC GET_DEPT_PROC(@p_ParentSiteId,@p_SiteId,@p_LoggedUserId:@p_curParam);";

     var res = XDB.FromSql<DashBoardData>(base.context, sql, parameters).ToList()[0];
}

XDB class 中的 FromSQL 方法:

public static IQueryable<TEntity> FromSql<TEntity>(DbContext EFContext,RawSqlString sql, IEnumerable<OracleParameter> op) where TEntity : class
{
     return EFContext.Set<TEntity>().FromSql(sql, op);
}

這是示例的答案:

。:Oracle存儲過程:

create or replace Procedure GET_DEPT_PROC (
p_ParentSiteId number,
P_SiteId number,
P_LoggedUserId number, curParam OUT sys_REFCURSOR,curParam2 OUT sys_REFCURSOR )
as
Begin
OPEN curParam FOR 
select 1 Id, 2 EntityAlmostOnRenewalTrans, 3 EntityVerifiedTrans, 4 EntityCompletedTrans, 5 EntityClosedTrans, 6 MyVerifiedTrans, 7 MyCreatedTrans, 8 MyDraftedTrans, 9 MyRejectedTrans FROM DUAL;
OPEN curParam2 FOR
select 1 Id, 2 EntityAlmostOnRenewalTrans, 3 EntityVerifiedTrans, 4 EntityCompletedTrans, 5 EntityClosedTrans, 6 MyVerifiedTrans, 7 MyCreatedTrans, 8 MyDraftedTrans, 9 MyRejectedTrans FROM DUAL;
End; 

。:在Oracle中執行SP:

DECLARE
CUR1 SYS_REFCURSOR;
CUR2 SYS_REFCURSOR;
BEGIN
TestOracleSP (1,2,3,CUR1,CUR2) ;
END;

。:使用FromSQL方法在代碼中執行:

 public virtual DashBoardData GetDashBoardData(short parentSiteId, short siteId, int loggedUserId)
{

try
        {


            OracleParameter p1 = new OracleParameter("p_ParentSiteId", parentSiteId);
            OracleParameter p2 = new OracleParameter("p_SiteId", siteId);
            OracleParameter p3 = new OracleParameter("p_LoggedUserId", loggedUserId);
            OracleParameter p4 = new OracleParameter("CUR", OracleDbType.RefCursor, ParameterDirection.Output);
            OracleParameter p5 = new OracleParameter("CUR2", OracleDbType.RefCursor, ParameterDirection.Output);

            string sql = "BEGIN GET_DEPT_PROC(:p_ParentSiteId, :p_SiteId, :p_LoggedUserId, :CUR2, :CUR);END;";
            var res = context.Set<DashBoardData>().FromSql(sql, p1, p2, p3, p4, p5).ToList();

            return res[0];

        }
        catch (Exception x)
        {
            XLogger.Error("Exception : " + x);
            return null;
        }
  }

您可以使用我寫的存儲過程腳手架:

EntityFramework.Oracle.StoreProcedure.腳手架

它使用所有過程和 UDDT(如果存在)為您的上下文創建一個新的部分類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM