![](/img/trans.png)
[英]Procedure with out parameter (SYS_REFCURSOR) with Entity Framework
[英]How to call Oracle stored procedure which accepts RefCursor as out parameter using Entity Framework
我有一個 Oracle 存儲過程,它接受多個 RefCursor 類型的輸出參數(下面的代碼)。
create or replace
PROCEDURE PROCEDURE1(
lookupvalues out SYS_REFCURSOR,
lookupvalues1 out SYS_REFCURSOR)
AS
BEGIN
open lookupvalues for
select attribute3 from table1 where attribute3 is not null;
open lookupvalues1 for
select attribute1 from table2 where attribute1 is not null;
END PROCEDURE1;
我只需要使用 c# 和實體框架將這些 out 參數的結果作為數據集。
我能夠獲取數據,但我認為這不是一個不錯的方法。
我想使用實體框架來檢索數據(如果可能的話)。
using (APWCContext dbcontext = new APWCContext())
{
using (var cmd = dbcontext.Database.Connection.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "PROCEDURE1";
var businessUnit = new OracleParameter("lookupvalues", OracleDbType.RefCursor, ParameterDirection.Output);
var currency = new OracleParameter("lookupvalues1", OracleDbType.RefCursor, ParameterDirection.Output);
cmd.Parameters.AddRange(new[] { businessUnit,currency});
cmd.Connection.Open();
var reader= cmd.ExecuteReader();
DataTable budt = new DataTable();
while (reader.Read())
{
budt.Load(reader);
}
var data = businessUnit.Value;
cmd.Connection.Close();
}
//var businessUnit = new OracleParameter("lookupvalues", OracleDbType.RefCursor, ParameterDirection.Output);
var r = dbcontext.GOODWILL_HEADER_STG.FirstOrDefault();
//var result = dbcontext.Database.ExecuteSqlCommand("BEGIN PROCEDURE1(:lookupvalues); END;", businessUnit);
}
在不完全了解您的要求范圍的情況下,您的程序似乎沒有必要。 另一個問題可能是您為什么要使用實體框架?
請參閱此處引用的答案:
您只需要定義您的實體表table1
一次,然后使用 Linq 提取信息。
請參閱從鏈接答案中提取的修改后的代碼:
DataTable dt = new DataTable();
(from a1 in context.Table1.Where(i => i.Attribute3 != "").AsEnumerable()
from a2 in context.Table1.Where(i => i.Attribute1 != "").AsEnumerable()
select new
{
Attribute = a2.Attribute1 ?? a1.Attribute3
//etc
}).Aggregate(table, (dt, r) =>
{
dt.Rows.Add(r.Attribute);
return dt;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.