回答

收藏

在EntityFramework中执行Oracle存储过程

技术问答 技术问答 107 人阅读 | 0 人回复 | 2023-09-12

简而言之,我正在尝试Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用Entity) d( z. `) V1 z- I: T: A- f
Framework,但由于修改密钥的限制,EF无法处理此特定命令。7 h8 w% B2 x& u
过程中有一些参数(只是IN),并更新表中的值。我通过操作测试了它:4 d& O2 S: w; Z# I! n
execute PROCEDURE_NAME('parameter1',parameter2 etc.);它工作正常。
+ j0 p# l! `* [- p# U! X1 v我的参数定义如下:
9 a4 t# s; S! y! d1 \! l  sOracleParameter param1 = new OracleParameter(&quotARAM1",OracleDbType.Varchar2,changed.PARAM1,ParameterDirection.Input);object[] parameters = new object[]{                                                                                                                                                                                                  param1,...};我的查询是:' A" A/ I7 f; N
string query = "execute PROCEDURE_NAME(ARAM1,...);";我正在尝试从C#代码执行它。即通过操作:
5 k# a9 s  z7 H  N% o9 Y: r. O. s_context.Database.ExecuteSqlCommand(query,parameters);我收到错误ORA-00900:原因:该句子未被识别为有效SQL语句。如果没有安装过程选项,并发出要求该选项的选项SQL例如,语句(例如,CREATE
3 x& |* a/ I9 {4 z  e6 [( B, iPROCEDURE这个错误可能发生在句子上。你可以通过启动SQL * Plus确定是否安装了过程选择。如果没有显示PL / SQL选项未安装在标语中。( x1 G# O+ j% G3 W/ v( W) `
我认为缺少Procedural Option因为在控制台中创建和运行这个过程是可行的,所以不能成为原因。
3 ]! h% U5 W% S" e不幸的是,我的工具没有提供分析器,所以我无法捕获原因Entity4 l7 o6 a, K- ~
Framework生成的查询。有没有其他方法可以获得执行查询?也许你能看到我的代码有什么问题?
! L2 a8 n+ d/ T  c3 L' t                                                               
, X5 r8 E" m4 w5 b0 s& K& b    解决方案:                                                                2 W2 H( h* C& t: @3 n6 J
                                                                我找到了一个解决来如下的解决方案:
; @" H+ O. ]. P: dOracleConnection 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 POCOsOracleParameter 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 Parametersvar i = cmd.ExecuteNonQuery();connection.Close();程序本身显然存储在数据库中。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则