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

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - 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