Wae*_*rad 5 c# sql-server oracle entity-framework-core .net-core
当我尝试使用 Entity Framework Core 执行 Oracle 存储过程时,出现以下异常:
找不到 CLR 类型“OracleParameter[] 到关系类型的映射”
我尝试了ExecuteSqlCommand和FromSQL方法,都导致相同的异常。
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;
Run Code Online (Sandbox Code Playgroud)
执行此存储过程的 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];
}
Run Code Online (Sandbox Code Playgroud)
XDB类中的FromSQL方法:
public static IQueryable<TEntity> FromSql<TEntity>(DbContext EFContext,RawSqlString sql, IEnumerable<OracleParameter> op) where TEntity : class
{
return EFContext.Set<TEntity>().FromSql(sql, op);
}
Run Code Online (Sandbox Code Playgroud)
这是带有示例的答案:
.: 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;
Run Code Online (Sandbox Code Playgroud)
.:在Oracle中执行SP:
DECLARE
CUR1 SYS_REFCURSOR;
CUR2 SYS_REFCURSOR;
BEGIN
TestOracleSP (1,2,3,CUR1,CUR2) ;
END;
Run Code Online (Sandbox Code Playgroud)
.:使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14140 次 |
| 最近记录: |