2014-10-09 222 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; "); 

此解決方案。