2014-10-09 156 views
4

长话短说:我试图在Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般的应用程序中使用Entity Framework,但是这个特殊命令不能由于限制修改密钥的值而被EF处理)。在EntityFramework中执行Oracle存储过程

过程有一些参数(只有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标题,则未安装该选项。

我认为程序选项的缺乏不能成为一个原因,因为在控制台中创建和运行该程序是有效的。

不幸的是我的工具不提供分析器,所以我无法捕获由实体框架生成的查询。有没有其他的方式来获得执行的查询?或者,也许你可以看到我的代码有任何问题?

回答

4

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

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(); 

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

+0

谢谢@Landeeyo!我测试过,它适用于我 – 2017-10-05 15:06:25

6

试试这个查询字符串:

string query = "begin PROCEDURE_NAME(:PARAM1,...); end; "; 
-1
EntityERP context = new EntityERP(); // is a context map from entity 

context.Database.ExecuteSqlCommand("BEGIN STORED_PROCEDURE_NAME; END; "); 

此解决方案。