【问题标题】:Executing an Oracle stored procedure within EntityFramework在 EntityFramework 中执行 Oracle 存储过程
【发布时间】:2014-12-04 02:26:02
【问题描述】:

长话短说:我正在尝试在 Entity Framework 中运行 Oracle 存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用 Entity Framework 但由于限制,EF 无法处理此特定命令在修改键的值)。

Procedure 有一些参数(仅 IN)并更新表中的值。我通过运行对其进行了测试:

execute PROCEDURE_NAME('parameter1', parameter2 etc.);

它工作正常。

我的参数定义如下:

OracleParameter param1 = new OracleParameter("PARAM1", OracleDbType.Varchar2, changed.PARAM1, ParameterDirection.Input);

object[] parameters = new object[] { 
                param1,...};

我的查询是:

string query = "execute PROCEDURE_NAME(:PARAM1,...);";

我正在尝试从 C# 代码执行它。即通过运行:

_context.Database.ExecuteSqlCommand(query, parameters);

我收到错误 ORA-00900:原因:该语句未被识别为有效的 SQL 语句。如果未安装 Procedural Option 并且发出了需要此选项的 SQL 语句(例如,CREATE PROCEDURE 语句),则可能会发生此错误。您可以通过启动 SQL*Plus 来确定是否安装了 Procedural Option。如果未显示 PL/SQL 横幅,则说明未安装该选项。

我认为缺少 Procedural Option 不能成为原因,因为在控制台中创建和运行该过程是可行的。

很遗憾,我的工具不提供分析器,因此我无法捕获实体框架生成的查询。有没有其他方法可以获取执行的查询?或者您可能会发现我的代码有任何问题?

【问题讨论】:

    标签: c# sql oracle entity-framework


    【解决方案1】:

    试试这个查询字符串:

    string query = "begin PROCEDURE_NAME(:PARAM1,...); end; ";
    

    【讨论】:

      【解决方案2】:

      我找到了一个解决方案,它看起来如下:

      OracleConnection connection = (Oracle.DataAccess.Client.OracleConnection)_context.Database.Connection;
      connection.Open();
      OracleCommand cmd = _context.Database.Connection.CreateCommand() as OracleCommand;
      cmd.CommandText = "STORED_PROCEDURE_NAME";
      cmd.CommandType = CommandType.StoredProcedure;
      
      #region Parameters
      
      //original and changed are just some POCOs
      OracleParameter oNameOfParameter = new OracleParameter("oNameOfParameter", OracleDbType.Decimal, original.NameOfParameter, ParameterDirection.Input);
      OracleParameter oNameOfParameter2 = new OracleParameter("oNameOfParameter2", OracleDbType.Varchar2, original.NameOfParameter2, ParameterDirection.Input);
      
      OracleParameter NameOfParameter3 = new OracleParameter("nameOfParameter3", OracleDbType.Varchar2, changed.NameOfParameter3, ParameterDirection.Input);
      OracleParameter NameOfParameter4 = new OracleParameter("nameOfParameter4", OracleDbType.Decimal, changed.NameOfParameter4, ParameterDirection.Input);
      
      cmd.Parameters.Add(nameOfParameter3);
      cmd.Parameters.Add(nameOfParameter4);
      cmd.Parameters.Add(oNameOfParameter);
      cmd.Parameters.Add(oNameOfParameter2);
      
      #endregion Parameters
      
      var i = cmd.ExecuteNonQuery();
      connection.Close();
      

      程序本身显然是存储在数据库中的。

      【讨论】:

        【解决方案3】:
        EntityERP context = new EntityERP (); // is a context map from entity
        
        context.Database.ExecuteSqlCommand("BEGIN  STORED_PROCEDURE_NAME; END; "); 
        

        这个决议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-21
          • 2011-11-07
          相关资源
          最近更新 更多