2011-01-10 2 views
1

J'essaie de configurer un exemple de projet simple dans BizTalk qui obtient des modifications apportées à une table dans une base de données SQL Server et met à jour une copie de cette table dans Oracle db.BizTalk - générer un schéma à partir d'Oracle stocké proc avec argument variable de table

Du côté de SQL Server, j'ai un proc stocké appelé GetItemChanges() qui renvoie un nombre variable d'enregistrements. Du côté d'Oracle, j'ai un proc stocké nommé Update_Item_Region_Table() conçu pour prendre une table d'enregistrements en tant que paramètre afin qu'il puisse traiter tous les enregistrements retournés par GetItemChanges() en un seul appel. Il est défini comme ceci:

create or replace type itemrec is OBJECT (
     UPC    VARCHAR2(15), 
     REGION    VARCHAR2(5), 
     LONG_DESCRIPTION VARCHAR2(50), 
     POS_DESCRIPTION VARCHAR2(30), 
     POS_DEPT   VARCHAR2(5), 
     ITEM_SIZE   VARCHAR2(10), 
     ITEM_UOM   VARCHAR2(5), 
     BRAND    VARCHAR2(10), 
     ITEM_STATUS  VARCHAR2(5), 
     TIME_STAMP   VARCHAR2(20), 
     COSTEDBYWEIGHT  INTEGER 
); 

create or replace type tbl_of_rec is table of itemrec; 

create or replace PROCEDURE Update_Item_Region_table (Item_Data tbl_of_rec) 
IS 
errcode integer; 
errmsg varchar2(4000); 
BEGIN 
    for recIndex in 1 .. Item_Data.COUNT 
    loop 

    update FL_ITEM_REGION_TEST set 
     Region   = Item_Data(recIndex).Region, 
     Long_description = Item_Data(recIndex).Long_description, 
     Pos_Description = Item_Data(recIndex).Pos_description, 
     Pos_Dept   = Item_Data(recIndex).Pos_dept, 
     Item_Size   = Item_Data(recIndex).Item_Size, 
     Item_Uom   = Item_Data(recIndex).Item_Uom, 
     Brand    = Item_Data(recIndex).Brand, 
     Item_Status  = Item_Data(recIndex).Item_Status, 
     Timestamp   = to_date(Item_Data(recIndex).Time_stamp, 'yyyy-mm-dd HH24:mi:ss'), 
     CostedByWeight = Item_Data(recIndex).CostedByWeight 
    where 
     UPC = Item_Data(recIndex).UPC; 

    log_message(Item_Data(recIndex).Region, '', 'Updated item ' || Item_Data(recIndex).UPC || '.'); 

    end loop; 

EXCEPTION 
WHEN OTHERS THEN 
errcode := SQLCODE(); 
errmsg := SQLERRM(); 
log_message('CE', '', 'Error in Update_Item_Region_table(): Code [' || errcode || '], Msg [' || errmsg || '] ...'); 
END; 

Dans mon projet BizTalk que je produis les schémas et les informations de liaison pour les procédures stockées. Pour la procédure Oracle, j'ai spécifié un chemin pour le paramètre GeneratedUserTypesAssemblyFilePath afin de générer une DLL pour contenir la définition des types de données. Dans le port d'envoi sur le serveur, je mets le chemin d'accès à cette DLL Types dans le paramètre UserAssembliesLoadPath.

J'ai créé une carte pour traduire le schéma GetItemChanges() en schéma Update_Item_Region_Table().

Lorsque je l'exécute les données sont extraites et transformées bien, mais fait une exception en essayant de transmettre les données au proc Oracle:

* L'adaptateur n'a pas réussi à transmettre un message va envoyer le port « WcfSendPort_OracleDBBinding_HOST_DATA_Procedure_Custom » avec l'URL " oracledb: // dvotst/". Il sera retransmis après l'intervalle de nouvelle tentative spécifié pour ce port d'envoi. Détails: "System.InvalidOperationException: mappage de type personnalisé pour « HOST_DATA.TBL_OF_REC » est pas spécifié ou est invalide *

Il est donc apparemment pas obtenir les informations sur le

TBL_OF_REC type de données personnalisé dans la DLL Types..

des conseils sur la façon de faire ce travail?

Répondre

2

au cas où quelqu'un a d'autre problème avec ce type de tâche, mon problème était de ne pas avoir toutes les propriétés définies correctement avant de générer le schéma et les fichiers de liaison.

GeneratedUserTypesAssemblyFilePath < - j'avais celui-ci ...

GeneratedUserTypesAssemblyKeyFilePath < - Je n'ai pas eu ce un ensemble ... Je l'ai mis à la même forte fichier clé nommée je pour le reste des projets. Comme je devais fournir le chemin d'accès complet à la DLL dans le port d'envoi, je ne pensais pas qu'il devait être dans le GAC - mais c'est le cas - donc vous devez l'ajouter manuellement puisque le processus de déploiement ne met que les DLL de projet normales dans le GAC.

Je viens couru cette commande à partir de la fenêtre de commande Visual Studio:

gacutil /i [path to the generated user types DLL] /f 
+0

Il pourrait être bénéfique pour marquer ce que la bonne réponse. –

Questions connexes