【问题标题】:Oracle procedure not getting invoked from EF6?没有从 EF6 调用 Oracle 过程?
【发布时间】:2017-12-16 16:01:38
【问题描述】:

我在我的 Oracle 数据库中创建了一个用于切换特定触发器状态的过程,如下所示:

CREATE OR REPLACE PROCEDURE MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS AS
    vStatus VARCHAR(10);
    vAction VARCHAR(10):= 'ENABLE';
BEGIN
    SELECT STATUS INTO vStatus FROM USER_TRIGGERS
        WHERE TRIGGER_NAME = 'MY_TRIGGER_NAME';
    IF vStatus = 'ENABLED' THEN
        vAction := 'DISABLE';
    END IF;
    EXECUTE IMMEDIATE 'ALTER TRIGGER MY_TRIGGER_NAME ' || vAction;
END PROC_SWITCH_TRIGGER_STATUS;
/

我已经验证这在直接在数据库中执行时可以完美运行,问题是我想使用 EF 从 c# 代码执行它。我认为使用以下陈述之一是可能的:

  • db.Database.SqlQuery<object>("BEGIN MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS END;");
  • db.Database.SqlQuery<object>("CALL MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS();");
  • db.Database.SqlQuery<object>("EXEC MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS;");

执行它们后,触发器的状态没有任何影响,它保持不变。注意我在SqlQuery 泛型类型参数中使用了object,因为我的过程什么也不返回,我真的不知道这是否是这样,但它没有返回错误。我测试它不适用于以下情况:

class _Status { public string STATUS {get; set;} }
...
string q = "SELECT STATUS FROM USER_TIGGERS WHERE TRIGGER_NAME='MY_TRIGGER_NAME'";
_Status sBefore = db.Database.SqlQuery<_Status>(q);
<execution of any of the above procedure calls>
_Status sAfter = db.Database.SqlQuery<_Status>(q);
Console.WriteLine(sBefore.FirstOrDefault()?.STATUS);
Console.WriteLine(sAfter.FirstOrDefault()?.STATUS);

上面的输出是:

ENABLED
ENABLED

我正在使用 ODP.NET、托管驱动程序和 EF 6.2,我的问题/疑问是:您可以建议我做什么以使程序的调用/调用影响触发器的状态。我在连接到数据库和连接字符串时使用相同的 USER/SCHEMA。提前致谢!

【问题讨论】:

    标签: c# oracle entity-framework


    【解决方案1】:

    抱歉打扰了,我问的有点匆忙。无论如何,Database 属性中有一个ExecuteSqlCommand 可以让我实现我想要的。有两种调用方式:

    • db.Database.ExecuteSqlCommand("CALL MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS()")
    • db.Database.ExecuteSqlCommand("BEGIN MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS; END;")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2015-05-22
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多