我正在尝试在BizTalk中设置一个简单的示例项目,该项目可以对SQL Server数据库中的表进行更改,并在Oracle数据库中更新该表的副本。
在SQL Server端,我有一个名为GetItemChanges()的存储过程,它返回可变数量的记录。
在Oracle方面,我有一个名为Update_Item_Region_Table()的存储过程,旨在将记录表作为参数,以便它可以在一次调用中处理从GetItemChanges()返回的所有记录。它的定义如下:
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;
在我的BizTalk项目中,我为两个存储过程生成模式和绑定信息。对于Oracle过程,我为 GeneratedUserTypesAssemblyFilePath 参数指定了一个路径,以生成包含数据类型定义的DLL。在服务器上的“发送端口”中,我将该类型DLL的路径放在 UserAssembliesLoadPath 参数中。
我创建了一个映射来将GetItemChanges()模式转换为Update_Item_Region_Table()模式。
当我运行它时,数据被提取并转换得很好但是会导致异常,试图将数据传递给Oracle proc:
*适配器无法使用URL“oracledb:// dvotst /”发送发送端口“WcfSendPort_OracleDBBinding_HOST_DATA_Procedure_Custom”的消息。它将在为此发送端口指定的重试间隔后重新传输。详细信息:“System.InvalidOperationException:'HOST_DATA.TBL_OF_REC'的自定义类型映射未指定或无效。*
因此,显然没有将有关自定义数据类型TBL_OF_REC的信息输入到类型DLL中。
有关如何使这项工作的任何提示?
答案 0 :(得分:2)
如果其他人遇到此类任务的问题,我的问题是在生成架构和绑定文件之前没有正确设置所有属性。
GeneratedUserTypesAssemblyFilePath < - 我有这个......
GeneratedUserTypesAssemblyKeyFilePath < - 我没有这一套...我将它设置为我用于其余项目的同一个强名称密钥文件。
由于我必须在发送端口提供DLL的完整路径,我认为它不需要在GAC中 - 但确实如此 - 因此您必须手动添加它,因为部署过程只会放入正常的项目DLL进入GAC。
我刚从Visual Studio命令窗口运行此命令:
gacutil /i [path to the generated user types DLL] /f