2011-07-20 4 views
4

BLT prend-il en charge les procédures stockées Oracle? J'ai essayé de nombreuses méthodes, décrites ci-dessous pour le faire fonctionner mais pas de chance. La procédure stockée met à jour une table avec plusieurs valeurs. C'est la procédure stockée, une petite procédure de test.Prise en charge de BLToolkit Oracle SP

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; 
/

Essayé les éléments suivants

 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(); 

Cela ne fonctionne pas.

Essayé ce

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

Cela ne fonctionne pas.

Essayé ceci:

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

Cela ne fonctionne pas.

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

a également essayé ceci:

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

qui ne fonctionne pas.

Définissez le niveau de trace sur odp.net sur 7. Vous avez vu que l'appel était en cours, mais vous ne pouviez voir aucun paramètre. Échangé XE (pensé qu'il pourrait avoir été un problème de licence que DB était plus grand que 5 Go) pour l'entreprise Oracle. N'a pas fonctionné.

Créez un nouvel utilisateur, un fichier de données, un espace de table et attribuez-lui tous les rôles et les privilèges, y compris l'exécution de toute procédure pour l'utilisateur. N'a pas fonctionné.

J'ai couru un ado.net standard (très remonté) pour appeler la procédure stockée par OracleCommand et il a appelé parfaitement et a fait la mise à jour.

Je suis perplexe. Tout ce qui précède fonctionne pour SQL Server.

Merci. scope_creep

Répondre

4

Je fais comme

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

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

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

C'est un aller-retour supplémentaire, mais depuis que je suis seulement en utilisant des procédures stockées pour un couple de grandes mises à jour par lots, il ne compte pas vraiment, (les mises à jour normales/simples sont effectuées avec les opérations Linq DML)

+0

Appelle-t-il vraiment le SP. –

+0

Ne pas comprendre complètement votre question GetSpParameters -> appel à DB pour obtenir la collection de paramètres de la procédure stockée SetSpCommand (...). ExecuteNonQuery() -> appel à DB qui définit la collection de paramètres et exécute la procédure stockée sur le site -> [link] (http://www.bltoolkit.net/Doc.SetSpCommand.ashx?HL=setspcommand) Vous pouvez également l'utiliser pour vérifier si la collection de parémètres que vous créez est la correcte –

+0

J'ai utilisé OracleDb.SetSpCommand ("Beta_Auto_UPDATE", OracleDb.CreateParameters (Betar)) .ExecuteNonQuery(); –