惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
MyScale Blog
MyScale Blog
博客园 - Franky
The Cloudflare Blog
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
WordPress大学
WordPress大学
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Blog of Author Tim Ferriss
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
Martin Fowler
Martin Fowler
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
腾讯CDC
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
博客园 - 【当耐特】
美团技术团队
云风的 BLOG
云风的 BLOG

博客园 - NPPYQ

随便唠叨下 最近的事情 远程交易中的运费问题(转自魏武挥) 浦发 同城跨行取款突然收费了 2010年8月初 泉州将地震 预言还是谣言? sql使用递归更新树级表记录 Oracle Flashback 技术 总结 (转载) sqlserver2005 xml字段的读写操作 - NPPYQ - 博客园 清空数据库中所有表数据的方法 ORA-08177: 无法连续访问此事务处理 (转载) Biztalk使用NativeSQL TableChangeEvent和Query 从Oracle数据库读取数据 SQL SERVER 2005中的Schema详解 如何根据值查找所在的表和字段 DOTNET网站优化(转载) SQLServer 2005新功能,一些性能方面问题,sql 经典语句(转载) 使用SqlBulkCopy类结合DataTable类快速完成对目标为SQLSERVER的数据交换 SQL SERVER 中构建执行动态SQL语句 MOSS内容数据库网站容量达到最大 导致无法新建网站 在级别Configuration 上无法解析urn 错误 滴滴心血化彩虹——记县首届名师邓四喜
ORACLE和SQL SERVER数据交换的二进制问题
NPPYQ · 2009-11-12 · via 博客园 - NPPYQ

用BIZTALK交换数据也有不少时间了,主要是SQL SERVER 和ORACLE之间数据交互,同时还有 webservice,file,smtp,pop,ftp,http,excel,access等。曾经遇到的问题也一一解决,未解决的问题也正在尝试解决。以前从SQL到ORACLE遇到二进制交换,研究半天终于解决,后来遇到ORACLE到SQL的二进制交换,研究了几天,有所收获。


1 SQL SERVER

从SQL SERVER中取出数据,其中有的字段为二进制的,比如IMAGE。表结构如下:

CodeSqlTable

如图1 :


使用 SELECT * FROM RYZPK for xml auto,xmldata

得到的结果如下:

Codesqlnobase64

zp字段为二进制,得出的xml文档中不可能解析出二进制流,于是使用dbobject/RYZPK[@id='1']/@zp来替代,意思就是在RYZPK中主键为id='1'的记录,字段zp的值,相当于C++编程时的指针,传递的是一个内存地址,而不是实际值。

使用SELECT * FROM RYZPK for xml auto生成的架构文件如下:

Codenobase64xsd

可以看出image字段zp类型为xs:anyURI

如图2:


 

1.2 要想真正解析出二进制

可以将二进制转换成BASE64编码形势保存在xml中,方法如下:
 
  SELECT * FROM RYZPK for xml auto ,binary base64,xmldata
  得到的结果如下:

Codebase64

可以看出zp字段直接解析为文本了。

使用SELECT * FROM RYZPK for xml auto,binary base64生成的架构文件如下:

Codebase64xsd

可以看出image字段zp类型为xs:base64Binary
如图3:

1.3 但是更新SQL SERVER

 没法以字符串形式更新二进制字段,生成的更新该表架构文件如下:

CodeTarget

 如图 :

2 ORACLE

  使用Microsoft BizTalk Adapter for Oracle(r) Database适配器,
  表结构如下

Codeoracle

2.1 导出的架构文件如下:

CodeOraclexsd

BLOB字段PIC本身就是xsd:base64Binary类型
<xsd:element minOccurs="0" name="PIC" nillable="true" type="xsd:base64Binary" />

如图:

3 数据交换

从上面的分析可以看出

ORACLE为源时,可以以字符串形式base64编码方式读出;ORACLE为目标库时,也可以用base64编码的字符串更新目标字段,看来到现在为止,ORACLE还是很好很强大的。SQL为源,也可以以字符串形式base64编码方式读出,只有一个问题比较棘手,就是SQL SERVER为目标库时,如何更新目标二进制字段。

因为不能直接用base64编码的文本直接去更新该二进制字段,否则会报错。我曾经试着直接将该字段的架构类型改为xsd:base64Binary,结果是一样的。

主要原因是,SQL SERVER中未提供自动通过字符更新二进制字段的方法。而biztalk是基于xml文件的,里面不可能直接保存二进制字符。

解决方法

本人做到的是一个ORACLE到SQL SERVER的交换,有个字段为二进制,保存的是照片信息。
思路如下:
从ORACLE获得xml的消息,里面通过base64编码保存了一个二进制字段信息。
BIZTALK更新SQL SERVER 时,通过一个能接收base64编码字符串的存储过程,接收到该消息。
改存储过程将该消息中的二进制字段,即base64编码字符串解码成二进制字符,更新目标表中的字段。

值得注意的是:ORACLE出来的base64可能有点喝SQL SERVER的base64有点不同,通过以下转换(从代码看,貌似是无用功),可以成功。

Code

 

 SQL SERVER 中的用户函数,用于通过baseb64编码字符串转换为二进制字符串

CodeFUN

目标更新表的SP如下

CodeSP