实体框架使用通用存储库模式使用输出参数调用Oracle存储过程
我想调用一个简单的存储过程,它有两个输出参数,一个int和一个string。我想使用我的通用存储库模式来获取数据 以下是Oracle存储过程:实体框架使用通用存储库模式使用输出参数调用Oracle存储过程,oracle,entity-framework,stored-procedures,model-view-controller,repository-pattern,Oracle,Entity Framework,Stored Procedures,Model View Controller,Repository Pattern,我想调用一个简单的存储过程,它有两个输出参数,一个int和一个string。我想使用我的通用存储库模式来获取数据 以下是Oracle存储过程: create or replace procedure dummy_proc ( dummy1 in number, dummy2 in varchar2, dummy3 out number, dummy4 out varchar2) is begin dummy3 := 2500 + dummy1; d
create or replace procedure dummy_proc (
dummy1 in number,
dummy2 in varchar2,
dummy3 out number,
dummy4 out varchar2)
is
begin
dummy3 := 2500 + dummy1;
dummy4 := 'Sample text! -> ' || dummy2;
end dummy_proc;
public DbRawSqlQuery<T> SQLQuery<T>(string sql, params object[] parameters)
{
return Context.Database.SqlQuery<T>(sql, parameters);
}
public class Test
{
public int dummy1 { get; set; }
public string dummy2 { get; set; }
}
var dummy1 = new OracleParameter("dummy1", OracleDbType.Int32,50, ParameterDirection.Input) { Value = id };
dummy1.Size = 50;
var dummy2 = new OracleParameter("dummy2", OracleDbType.Varchar2,200, ParameterDirection.Input) { Value = model };
dummy2.Size = 200;
var dummy3 = new OracleParameter("dummy3", OracleDbType.Int32,50, ParameterDirection.Output) ;
dummy3.Size = 50;
var dummy4 = new OracleParameter("dummy4", OracleDbType.Varchar2, 200, ParameterDirection.Output) ;
dummy4.Size = 200;
object[] parameters = new object[] { dummy1,dummy2,dummy3,dummy4 };
var test = _repository.SQLQuery<Test>("BEGIN dummy_proc(:dummy1, :dummy2, :dummy3, :dummy4); END;", parameters);
var param3 = dummy3.Value;
var param4 = dummy4.Value;
我的通用存储库方法:
create or replace procedure dummy_proc (
dummy1 in number,
dummy2 in varchar2,
dummy3 out number,
dummy4 out varchar2)
is
begin
dummy3 := 2500 + dummy1;
dummy4 := 'Sample text! -> ' || dummy2;
end dummy_proc;
public DbRawSqlQuery<T> SQLQuery<T>(string sql, params object[] parameters)
{
return Context.Database.SqlQuery<T>(sql, parameters);
}
public class Test
{
public int dummy1 { get; set; }
public string dummy2 { get; set; }
}
var dummy1 = new OracleParameter("dummy1", OracleDbType.Int32,50, ParameterDirection.Input) { Value = id };
dummy1.Size = 50;
var dummy2 = new OracleParameter("dummy2", OracleDbType.Varchar2,200, ParameterDirection.Input) { Value = model };
dummy2.Size = 200;
var dummy3 = new OracleParameter("dummy3", OracleDbType.Int32,50, ParameterDirection.Output) ;
dummy3.Size = 50;
var dummy4 = new OracleParameter("dummy4", OracleDbType.Varchar2, 200, ParameterDirection.Output) ;
dummy4.Size = 200;
object[] parameters = new object[] { dummy1,dummy2,dummy3,dummy4 };
var test = _repository.SQLQuery<Test>("BEGIN dummy_proc(:dummy1, :dummy2, :dummy3, :dummy4); END;", parameters);
var param3 = dummy3.Value;
var param4 = dummy4.Value;
这是我将用来调用存储库方法的manager类:
create or replace procedure dummy_proc (
dummy1 in number,
dummy2 in varchar2,
dummy3 out number,
dummy4 out varchar2)
is
begin
dummy3 := 2500 + dummy1;
dummy4 := 'Sample text! -> ' || dummy2;
end dummy_proc;
public DbRawSqlQuery<T> SQLQuery<T>(string sql, params object[] parameters)
{
return Context.Database.SqlQuery<T>(sql, parameters);
}
public class Test
{
public int dummy1 { get; set; }
public string dummy2 { get; set; }
}
var dummy1 = new OracleParameter("dummy1", OracleDbType.Int32,50, ParameterDirection.Input) { Value = id };
dummy1.Size = 50;
var dummy2 = new OracleParameter("dummy2", OracleDbType.Varchar2,200, ParameterDirection.Input) { Value = model };
dummy2.Size = 200;
var dummy3 = new OracleParameter("dummy3", OracleDbType.Int32,50, ParameterDirection.Output) ;
dummy3.Size = 50;
var dummy4 = new OracleParameter("dummy4", OracleDbType.Varchar2, 200, ParameterDirection.Output) ;
dummy4.Size = 200;
object[] parameters = new object[] { dummy1,dummy2,dummy3,dummy4 };
var test = _repository.SQLQuery<Test>("BEGIN dummy_proc(:dummy1, :dummy2, :dummy3, :dummy4); END;", parameters);
var param3 = dummy3.Value;
var param4 = dummy4.Value;
var dummy1=newOracleParameter(“dummy1”,OracleDbType.Int32,50,ParameterDirection.Input){Value=id};
dummy1.尺寸=50;
var dummy2=新的OracleParameter(“dummy2”,OracleDbType.varchar2200,ParameterDirection.Input){Value=model};
dummy2.尺寸=200;
var dummy3=新的OracleParameter(“dummy3”,OracleDbType.Int32,50,ParameterDirection.Output);
dummy3.尺寸=50;
var dummy4=新的OracleParameter(“dummy4”,OracleDbType.varchar2200,ParameterDirection.Output);
dummy4.尺寸=200;
对象[]参数=新对象[]{dummy1,dummy2,dummy3,dummy4};
var test=_repository.SQLQuery(“开始伪过程(:dummy1,:dummy2,:dummy3,:dummy4);结束;”,参数);
var param3=dummy3.值;
var param4=dummy4.值;
这段代码似乎正确地调用了存储过程,但我的输出参数始终为null。我已经搜索了好几篇文章,但没有一篇使用与我找到的相同的模式。尝试使用
ExecuteSqlCommand
而不是SqlQuery。因为在Oracle存储过程中使用SqlQuery时存在很多问题
更新1
我发现从Oracle返回的输出结果存储在为
OracleParameter
创建的同一个变量中。我最终更改了存储库方法,并使用ExecuteSqlCommand而不是SqlQuery,这现在返回了正确的输出。在我的例子中,我的输出参数只是返回字符串信息,所以我只是连接结果并返回JsonResultMessage
public JsonResultMessage ExecuteOracleStoredProcedure(string query, params object[] parameters)
{
var result = new JsonResultMessage
{
Success = true,
Message = "Successfully executed procedure."
};
try
{
var results = _context.Database.ExecuteSqlCommand(query, parameters);
var output = new OracleParameter("p_message", OracleDbType.Varchar2, ParameterDirection.Output) { Size = 999000 };
foreach (OracleParameter parameter in parameters)
{
if (parameter.Direction.Equals(ParameterDirection.Output))
{
result.Message = parameter.Value.ToString();
}
}
}
catch (Exception ex)
{
result.Success = false;
result.Message = "Error executing procedure: ." + ex;
}
return result;
}
JsonResultMessage是我的结果的简单容器:
public class JsonResultMessage
{
public bool Success { get; set; }
public string Message { get; set; }
}
调用此方法时,我使用以下语法:
resultMessage = _repository.ExecuteOracleStoredProcedure("begin IMACMPS1.com_check_end_item(:param1, :param2, :param3);end;",
new OracleParameter("p_to_site", OracleDbType.Varchar2, ParameterDirection.Input) { Value = siteCode, Size = 50 },
new OracleParameter("p_part_no ", OracleDbType.Varchar2, ParameterDirection.Input) { Value = partNo, Size = 35 }
);
其中check_end_item是我的过程的名称