凌波微步

暂无签名

  • 博客访问: 575717
  • 博文数量: 106
  • 用 户 组: 普通用户
  • 注册时间: 1970-01-01 08:00
个人简介

鏆傛棤浠嬬粛

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(106)

文章存档

2009年(5)

2005年(35)

2004年(66)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
Oracle的OLEDB 2005-03-23 20:25:35

分类: Oracle

最近在处理两个问题,都是sqlserver用linkserver连接oracle的问题。

使用了oracle提供的OLEDB,发现各个版本居然都在报错,我FT!

在metalink上查了半天,也没什么有用的信息。大部分都是没有解决的case。

只总结了以下两种情况:

[@more@]

原则:
尽量使用同一版本的oracle的client和server。
至于8i的版本,oracle自己都不支持了。可以尝试升级到817的最后一个版本,可能能解决问题。    

 
1. Oracle client 10.1.0.2 --oracle server 10g
oracle中table :test(cc char(2))
在linkserver中操作oracle的table:test
insert into ORACLE..DLINGER.TEST values('cc')
成功
select * from ORACLE..DLINGER.TEST
Server: Msg 7320, Level 16, State 2, Line 1
Could not execute query against OLE DB provider 'OraOLEDB.Oracle'.
OLE DB error trace [OLE/DB Provider 'OraOLEDB.Oracle' ICommandText::Execute returned 0x80040155].

解决方法:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerProvidersORAOLEDB.ORACLEAllowInProcess
value改成1


2. Oracle client 9204 --oracle server 9204
table:test1(cc int)
select * from test..DLINGER.TEST1

服务器: 消息 7356,级别 16,状态 1,行 1
OLE DB 提供程序 'OraOLEDB.Oracle' 为列提供的元数据不一致。执行时更改了元数据信息。
OLE DB 错误跟踪[Non-interface error:  Column 'DUMMY' (compile-time ordinal 1) of object '"DLINGER"."TEST"' was reported to have a DBTYPE of 129 at compile time and 130 at run time]。

这里我们发现当使用有精度的数据类型的时候,这个查询是不会报这种元数据类型不匹配的错误的。
这个是oracle的bug:3117040  在9.2.0.4.10中修正。
那么如果oracle的版本低于这个,避免在sqlserver的link seerver需要访问的column中使用没有精度的数据类型。
create table abc(col1 number(10));         OK
create table abc1(col1 number(38));    OK
create table abc1(col1 number(38,2));    OK
create table abc2(col1 float(126));     OK
create table abc3(col1 varchar2(4000));     OK
create table abc4(col1 varchar2(255));    OK
create table abc5(col1 date);      OK
create table abc6(col1 char(20));     OK
create table abc7(col1 char(2000));     OK
create table abc8(col1 long);      ERROR
create table abc9(col1 integer);     ERROR
create table abc10(col1 float(50));     OK
create table abc11(col1 blob);              OK
create table abc12(col2 clob);               ERROR
注意:timestamp的数据类型是不支持的。

create table test3(col2 number(38,2));
select * from test..DLINGER.TEST3
这个问题解决了之后,我们发现又返回了另一个错误:
服务器: 消息 7320,级别 16,状态 2,行 1
未能对 OLE DB 提供程序 'OraOLEDB.Oracle' 执行查询。
OLE DB 错误跟踪[OLE/DB Provider 'OraOLEDB.Oracle' ICommandText::Execute returned 0x80040155]。

这个和10g中的错误是一致的,我们同样查看注册表的键值:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerProvidersORAOLEDB.ORACLEAllowInProcess,
在我的9i的环境下注册表中没有相关的项,手工添加它,key值为1。
现在可以执行查询了。

阅读(586423) | 评论(0) | 转发(1) |
0

上一篇:开始繁忙

下一篇:25天

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册