没有从EF6调用Oracle过程?

时间:2017-12-16 16:01:39

标签: c# oracle entity-framework

我在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;");

执行它们后,触发器中没有任何效果&#39;状态,它保持不变。注意我在object泛型类型参数中使用了SqlQuery&#39;因为我的程序没有返回任何内容,我真的不知道这是否正确,但它没有给出任何错误。我测试它不能使用以下内容:

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,我的疑问/怀疑是:你可以建议我做什么,以便程序的调用/调用影响触发器&#39;状态。我在连接数据库和连接字符串时使用相同的USER / SCHEMA。提前谢谢!

1 个答案:

答案 0 :(得分:0)

对不起,我匆匆忙忙地问了一下。无论如何,ExecuteSqlCommand属性中的Database可以让我实现我想要的目标。有两种调用方式:

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