Поддержка BLToolkit Oracle SP - PullRequest
4 голосов
/ 20 июля 2011

Поддерживает ли BLT хранимые процедуры Oracle? Я попробовал множество методов, описанных ниже, чтобы заставить его работать, но не повезло. Хранимая процедура обновляет таблицу с несколькими значениями. Это хранимая процедура, небольшая процедура тестирования.

DROP PROCEDURE BETA_AUTO_UPDATE;
/

 CREATE OR REPLACE PROCEDURE BETA_AUTO_UPDATE
   (
      AutoId IN NUMBER,
      Rule  IN NVARCHAR2,  
      Nam  IN NVARCHAR2,
      Loc IN NVARCHAR2
   )
  IS
  BEGIN 

UPDATE Beta_Auto
SET RuleGuid = Rule,        
    Name = Nam,
    Location = Loc
WHERE Id=AutoId;

  EXCEPTION 
     WHEN OTHERS THEN 
         RAISE_APPLICATION_ERROR(-20001, 'ERROR OCCURED DURING UPDATE');


   END BETA_AUTO_UPDATE;
   /

попробовал следующее

        DbManager.AddDataProvider(new OdpDataProvider());
        DbManager OracleDb = new DbManager("BetaOracleDBConn");

        Beta_Auto Betar = new Beta_Auto();
        Betar.ID = 1;
        Betar.Name = "Jim";
        Betar.RuleGuid = "jlDKDKDKDKDKDKp";
        Betar.Location = "LocDLDLDLDLDtor";

        OracleDb.SetSpCommand("Beta_Auto_UPDATE",       
        OracleDb.CreateParameters(Betar)).ExecuteNonQuery();

Это не сработало.

Попробовал это

        [ActionName("UPDATE")]
        public abstract void Update(Beta_Auto Auto);

Это не сработало.

Попробовал это:

        [SprocName("Beta_Auto_Update")]
        public abstract void UpdateByParam(
        [Direction.InputOutput("ID", "RuleGuid", "Name", "Location")] Beta_Auto Auto);

Это не сработало.

          [SprocName("Beta_Auto_Update")]
          public abstract void UpdateByParam(int Id, string RuleGuid, string Name,  string Location);

Также попробовал это:

[ActionName("Update")]
public abstract void UpdateByParam(int Id, string RuleGuid, string Name, string Location);

Это не сработало.

Установите уровень трассировки на odp.net равным 7. Видел, что выполняется вызов, но не видит никаких параметров. Поменял XE (подумал, что это может быть проблема с лицензированием, так как db была больше, чем 5 ГБ) для корпоративного Oracle. Не сработало

Создайте нового пользователя, файл данных, табличное пространство и назначьте ему все роли и привилегии, включая «Выполнить любую процедуру». Не сработало

Я запустил стандартный ado.net (очень длинный), чтобы вызвать хранимую процедуру через OracleCommand, и он прекрасно вызвал и сделал обновление.

Я в тупике. Все вышеперечисленное работает для SQL Server.

Спасибо. scope_creep

1 Ответ

4 голосов
/ 01 августа 2011

Я делаю это как

        var parameters = OracleDb.GetSpParameters("BETA_AUTO_UPDATE", true, true);

        parameters.SetParamValue("pParam1", param1);
        parameters.SetParamValue("pParam2", param2);
        ...

        OracleDb.SetSpCommand("BETA_AUTO_UPDATE", parameters).ExecuteNonQuery();

Это дополнительная передача туда и обратно, но поскольку я использую хранимые процедуры только для пары больших пакетных обновлений, это на самом деле не имеет значения (обычные / простые обновления выполняются с помощью операций Linq DML)

...