Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实体框架使用通用存储库模式使用输出参数调用Oracle存储过程_Oracle_Entity Framework_Stored Procedures_Model View Controller_Repository Pattern - Fatal编程技术网

实体框架使用通用存储库模式使用输出参数调用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

我想调用一个简单的存储过程,它有两个输出参数,一个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;
    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是我的过程的名称