事由:python脚本做事务的时候 cx_Oracle连接oracle数据库在上传数据的时候 经常发送断开连接而导致事务失败,因为没有数据库的管理权限,所以打算试试用JDBC和ODBC的连接方式会不会更好一点(太闲了)。在配置odbc时候有点头疼!所以做一个记录!
系统 :64位win10
python:3.7 64位 所以只能装64位的odbc驱动
oracle:11.2.0.4.0 64位,选择这个,是因为远程Oracle数据库是11g的
1 安装文件解压
instantclient-basic-windows.x64-11.2.0.4.0.zip
instantclient-odbc-windows.x64-11.2.0.4.0.zip
instantclient-sqlplus-windows.x64-11.2.0.4.0.zip
解压到同一目录,如:D:\installer\oracle\instantclient_11_2
2 系统变量配置
Path :D:\installer\oracle\instantclient_11_2
ORACLE_HOME : D:\installer\oracle\instantclient_11_2
TNS_ADMIN:D:\installer\oracle\instantclient_11_2
NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS1或者AMERICAN_AMERICA.ZHS16GBK
3 安装odbc
管理员模式进入cmd,
cd到D:\installer\oracle\instantclient_11_2 执行odbc_install.exe
4 tns ora文件复制
32位按上述步骤就可以正常配置数据库了
64位却会有错误提示 –》添加数据库出现错误14001,加载驱动失败,并行配置不正确。
错误问题查找
1 Cmd命令 SxsTrace Trace -logfile:SxsTrace.etl 回车开启追踪
2 点击添加odbc数据库 出现14001错误
3 回到cmd窗口,enter结束追踪
4 把追踪文件格式转变为可阅读的txt格式:SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt
在cmd当前目录文件夹下找到sxstrace.txt文件,查看文本内容,其中有错误项,是vc80的问题,因此到微软官网下了个vc2005 64的版本 安装,然而配置odbc的时候还是一样的错误
1 仔细看最新的sxstrace.txt内容,发现在错误的前一段,有描述用到安装目录中的Microsoft.VC80.MFC.manifest文件,然而,安装目录中根本没有这个文件,
2 因此在网络上搜索并下载了一个Microsoft.VC80.MFC.manifest放进安装目录。
3 用txt文本打开,把其中的版本号改成和sxstrace.txt中的错误部分中提及的vc版本号一致,注意64位系统要改成amd64
4 再次配置odbc,结果还是错误,错误变成了126
5 这里不知道是什么错误了,猜测是dll的问题,所以下载了Microsoft.VC80.MFC.manifest文件中提及的对应版本的dll放进安装目录,再次配置odbc ,错误变成了139。
到此,我没有办法了。因此把Microsoft.VC80.MFC.manifest和加进来的dll转移到一个文件夹放好,休息一会儿,没想到再次回来的时候 odbc配置奇迹的成功了。我也不知道是哪一步对了....
Orcle的odbc配置要注意:
Data Source Name 自己取的名字如:"test"
Description 连接描述 这里可不填
TNS Service Name 有两种方式进行
一是点击下拉tnsnames.ora配置的名称如TEST"
二是填写IP地址+端口号+SID 如: "ip:1521/server name"
UserID 访问数据库的用户名
TNS service Name 这里只有第二种填写方式才可以用python通过pyodbc进行连接,否则连接会失败:提示无效的连接字符串属性,
而且连接必须用dsn方式连接
conn = pyodbc.connect ('DSN=Data Source Name;PWD=******')
直接用字符串连接的方式(运行错误)
constr = 'DRIVER={Oracle in instantclient_11_2};’
constr = constr + ‘SERVER=ip:1521;’
constr = constr +’DATABASE=Data Source Name;UID=UserID;PWD=******'
cnxn =pyodbc.connect(constr)
错误提示:协议适配器错误,目前还不知道如何处理这个问题,但应该和服务器设置有关