如何在64位win7下通过ODAC来访问Oracle服务器
1常用的plsql与sqldbx只有32位版本,只能使用32位的ODAC,
2在64位系统上,如果使用32位的ODAC,aspnet程序时会报异常:尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题。
332位的ODAC安装时无法向注册表写入必要信息,分布式服务Oracle Services for MTS无法安装
后来在网上疯狂搜索,发现出了这个问题的人还不少,其实,Oracle的客户端版本与服务端版本没有必然限制,32/64位的客户端访问32/64位的服务器没有任何问题,32位的客户/服务端装在32位的操作系统上,32/64位的客户/服务端装在64位的操作系统上也没有任何问题,主要是这些客户端与其它程序的兼容性问题看来64位的系统想普及,还需时日啊
当然,解决的方法也是有的,主要思路就是不管32/64位的ODAC都一并装上去,然后plsql与sqldbx通过32位的ODAC来访问数据库,aspnet程序通过64位的ODAC来访问数据库/使用分布式事务
首先,安装64位的ODAC(installbat oramts)由于操作系统也是64位的,这样就只需按照常规方式,在环境变量(Path)里加上其目录与其bin目录的路径,然后去注册表里修改语言设置(NLS_LANG),再加上监听文件路径(TNS_ADMIN),aspnet程序就可以通过64位的ODAC来访问数据库/使用分布式事务了
然后,安装32位的ODAC(installbat basic)由于操作系统是64位的,无法操作注册表,这样安装后无法在注册表里写入必要数据,使用时也无法从中读取必要设置这样相关的设置就只能通过环境变量来读取还是在环境变量(Path)里加上其目录与其bin目录的路径,然后在环境变量里加上语言设置(NLS_LANG)与监听文件路径(TNS_ADMIN),然后在plsql与sqldbx的程序设置里,将oci文件路径强制指定为32位的ODAC路径,这样程序就可以正常使用了
这里有几点需要说明:
1如上所述,在Path里既有32位ODAC的路径又有64位ODAC的路径,这样相关程序会不会读取错误呢结论是不会,32位的plsql与sqldbx会跳过64位的oci去调用32位的oci,而64位的aspnet程序则会跳过32位的oci去调用64位的oci这样大家互不冲突
232位的程序与64位的程序可以共同指向同一个监听目录,使用同一个监听文件
3环境变量的更改与生效之间有时间差,可以不到1秒,也可能几分钟,所以最可靠的方式是重启
第一种情况:
若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了。不过要注意环境变量%ORACLE_HOME%/network/admin/是否设置。
第二种情况:
本机未安装oracle服务器,也未安装oracle客户端。但是安装了pl sql development、toad sql development、sql navigator等管理数据库的工具。在虚拟机或者另一台电脑上安装了oracle服务器,也就是虚拟机或者另一台电脑此时作为服务器。
这种情况下,本人以pl sql development远程连接ORACLE服务端数据库为例:
1、在安装oracle服务器的机器上搜索下列文件:
ocidll
ocijdbc10dll
ociw32dll
orannzsbb10dll
oraocci10dll
oraociei10dll
sqlnetora
tnsnamesora
classes12jar
ojdbc14jar
把这些找到的文件复制放到一个文件夹,如 oraclient,将此文件夹复制到客户端机器上。如放置路径为 D:oraclient。
2、配置tnsnamesora,修改其中的数据库连接串。
oracledata = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192168058)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = oracledata) )
其中,oracledata是要连接的服务名;HOST = 192168058,是服务器IP地址;PORT = 1521是端口号。
3、添加第一个环境变量,名为TNS_ADMIN,值为tnsnamesora文件所在路径(如:D:oraclient,特别是重装后或其它操作,忘了TNS_ADMIN变量,plsql登陆就会报无法解析指定的连接标识符),这是为了能够找到上面说的tnsnamesora。这步是最重要的。
添加第二个环境变量(可有可无):“NLS_LANG = SIMPLIFIED CHINESE_CHINAZHS16GBK”,(AMERICAN_AMERICAUS7ASCII 是ASCII编码类型,其它类型可自己到服务器看一下或网上查找一下)(本步骤暂时要做对,如果编码不对,会产生乱码)。
4、下载并安装PL SQL Developer配置应用:
打开PL SQL Developer,登入界面点取消,进入后选择菜单栏 tools->preferences->connection :
Oracle Home=D:oracleclient OCI library=D:oracleclientocidll
5、再次打开plsql则会在database中有oracledata 选项输入用户名密码就可以登陆。
第三种情况:
本机未安装ORACLE服务器,但是安装了oracle客户端,也安装了pl sql development、toad sql development、sql navigator等管理数据库的工具。在虚拟机或者另一台电脑上安装了oracle服务器,也就是虚拟机或者另一台电脑此时作为服务器。
这种情况下,本人以pl sql development远程连接oracle服务端数据库为例:
1、打开oracle客户端中的net manager,配置要远程连接的数据库名、IP地址等,如果net manager中没有要远程连接的数据库名,则新建即可。
2、其他步骤与第二种情况中的2---5相同。
第四种情况:
本机未安装oracle服务器,也未安装pl sql development、toad sql development、sql navigator等管理数据库的工具,但是安装了oracle客户端。在虚拟机或者另一台电脑上安装了ORACLE服务器,也就是虚拟机或者另一台电脑此时作为服务器。
这种情况下,本人以oracle客户端中的sqlplus远程连接oracle服务端数据库为例:
1、打开oracle客户端中的net manager,配置要远程连接的数据库名、IP地址等,如果net manager中没有要远程连接的数据库名,则新建即可。
2、同第二种情况中的步骤二。
3、同第二种情况中的步骤三。
4、打开sqlplus:
(1)如果用sys用户登入,则用户名:sys 密码:xxxxxx 主机字符串:要连接的数据库名 as sysdba,登入即可。
(2)如果用其他用户登入,则用户名:xxx 密码:xxxxxx 主机字符串:要连接的数据库名,登入即可。
注意事项:
1、服务器端和客户端防火墙需要关闭;
2、我们经常会遇到***服务无法启动,那么需要打开Net Configuration Assistant修复,或者新建***服务。
3、数据库密码如果忘了怎么办?按照以下方法修改密码即可:
开始-->运行-->cmd
输入 :sqlplus /nolog 回车
输入 :connect / as sysdba 回车
用户解锁 : alter user system account unlock 回车
修改密码:alter user system identified by manager
4、怎样判断数据库是运行在归档模式下还是运行在非归档模式下?
进入dbastudio,历程--〉数据库---〉归档查看。
5、另外,如果本机和别的机子均安装了oracle服务器端,那么本机如果要连接别的机子,就必须修改tnsnamesora
步骤1:打开企业管理器,如下。
步骤2:选择数据库,安全性,点击新建链接服务器。
步骤3:选择链接服务器属性,常规,输入名称:TEST,选择ORACLE数据库提供程序,输入名称、数据源。
步骤4:进行安全性设置。本地登录,选择SQLServer数据库登录用户,远程登录用户和密码,输入远程连接数据库的用户和密码,选择用此安全上下文进行,输入远程登录用户和密码。
5
步骤5:点击TEST链接服务器下的表,我们可以访问ORACLE数据库的表了。
注意:产品名称要和所链接的服务器相对应,使用ORACLE数据库就要输入ORACLE,使用SQLServer就输入SQLServer。
软件环境: 1、Windows NT40+ORACLE 804
2、ORACLE安装路径为:C:\ORANT
3、服务器A、服务器B,均装有NT 40中文版
实现方法: 1 假设A地址192111,B地址192112
2 A、B上配置好TCP/IP,互相Ping通。
3 配置initora文件,若global_name = true的话,database link 的名字必须同远程机的实例名相同,
为简便起见,请将global_name 设为 false。
4 在服务器上配置tnsnamesora,将Remote机器的地址(IP)信息加入本地的tnsnamesora
A服务器:
TNSA_B =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = tcpworld)
(PROTOCOL = TCP)
(Host = 192112)
(Port = 1521)
)
)
(CONNECT_DATA = (SID = ORCL)
)
)
B服务器:
TNSB_A =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = tcpworld)
(PROTOCOL = TCP)
(Host = 192111)
(Port = 1521)
)
)
(CONNECT_DATA = (SID = ORCL)
)
)
5 在 SQLPlus 或其它工具中创建数据库链接
A服务器:create public database link A_TO_B connect to tmp identified by tmp using 'TNSA_B';
B服务器:create public database link B_TO_A connect to tmp identified by tmp using 'TNSB_A';
说明:
tmp是一个临时用户,A服务器、B服务器上均有,它的作用是提供链接的目的地,
假如:
B服务器上有user1、user2、tmp三个用户,user1和user2把他们想要对外公开的表的权限授给tmp用户,
那么,所有能通过database link连接到tmp用户上的人就可以直接访问user1、user2上的已授权表了。
6 建立database link以后,请用这种格式select from table_name@database_link_name 的方式访问
如:在A服务器上想访问B服务器上user1用户table1表的内容(A到B的连接为A_TO_B),则
SQL> select from table1@A_TO_B;
7 如果Oracle版本为73,则数据库联接写法如下:
A服务器:create public database link A_TO_B connect to tmp identified by tmp using 't:192112:orcl';
B服务器:create public database link B_TO_A connect to tmp identified by tmp using 't:192111:orcl';
配置一下TNSNAMES,然后就可以连接了
比如在
Oracle\product\1010\Client_1\NETWORK\ADMIN
打开tnsnamesora
然后添加
DEV =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxxxxxxxxxxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dev)
)
)
HOST根据实际的IP地址或者域名配置,PORT也是,默认是1521,Service_name是数据库名(sid)
0条评论