2

我是 Entity Framework 的新手,并试图调用 oracle 存储过程,但没有成功。所以这是我的问题:

如何使用 devart dotConnect 调用 oracle 存储过程?

例如,我有存储过程:

procedure get_problems(res out sys_refcursor) is
  begin

   open res 
   for
   select id, name
   from problems;  

  end;

从 C# 我想打电话给:

 using (Entities entities = new Entities())
 {
     ObjectParameter res = new ObjectParameter("res", typeof(byte[]));
     ObjectResult<PROBLEM> problems = entities.SelectAllProblems(res);
 }

但它抛出“EntityCommandExecutionException”:

执行命令定义时发生错误。有关详细信息,请参阅内部异常。

这是内部异常:

ORA-06550:第 2 行,第 3 列:\nPLS-00306:调用“GET_PROBLEMS”时参数的数量或类型错误\nORA-06550:第 2 行,第 3 列:\nPL/SQL:语句被忽略

我用了

“类型(字节[])”

作为 ObjectParameter 类型,因为我在 Devart Entity Developer 生成的代码中看到了这一点。

ps 顺便问一下,你会如何在大型项目中推荐 dotConnect?

4

2 回答 2

0

在我们的博客中查看这篇文章。
您可以使用我们的论坛反馈页面与我们联系。

于 2011-04-15T12:59:04.697 回答
0

我知道这是不久前提出的,但它可能会帮助其他人,因为我花了一段时间才弄清楚这一点。以下是我们如何在包 (P_SID) 中调用存储过程 (SID_PGet) 并使用 DotConnect 返回单个字符串值。(这只返回一个值 - 我目前正在尝试找出如何返回 sys_refcursor)。

这是存储过程:

PROCEDURE SID_PGet(io_SID OUT varchar2) is
Begin
   io_SID:=GetSID; -- GetSID returns a unique varchar value
End;

在 C# 的 DbContext 中:

public string GetNextSId()
{
    var parameter = new Devart.Data.Oracle.OracleParameter("io_SID", Devart.Data.Oracle.OracleDbType.VarChar, ParameterDirection.Output);
    this.Database.ExecuteSqlCommand("BEGIN P_SID.SID_PGet(:io_SID); END;", parameter);
    var sid = parameter.Value as string;

    return sid;
}
于 2012-05-23T09:09:14.503 回答