尽管2020了,但是需求无处不在,ASP连接Oracle数据库问题的解决过程:
注意,本文为梦回大唐版本,盗图严重,纰漏难免,欢迎举报。
一、环境
数据库端:Windows Server 2008 R2 64位企业版 + Oracle 11.2.0.1.0 64位 企业版
客户端:Windows Server 2008 R2 64位企业版 + IIS +ASP
二、连接Oracle
方式一:失败。
Oracle官网下载的客户端和ODBC驱动:
instantclient-basic-windows.x64-11.2.0.4.0
instantclient-odbc-windows.x64-11.2.0.4.0
Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC 安全更新_x64
(ODBC需要,微软这个挺难找,只能找到更新,但是适用)
安装过程大概是这样:
装Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package x64
将instantclient-basic和instantclient-odbc压缩包里面的文件都放到一个文件夹。如: C:\oracle
创建C:\oracle\network\admin\tnsnames.ora,内容如下:
APPORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.22.30)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
右键odbc_install.exe以管理员运行,安装odbc驱动。
创建环境变量:
添加到系统的环境变量Path:C:\oracle;C:\oracle\bin
添加:TNS_ADMIN 值:C:\oracle\network\admin\tnsnames.ora
创建ODBC:
(默认运行的是64位)开始-管理工具-数据源(ODBC)-系统DSN-添加-选择刚安装的instantclient驱动。
配置图,盗用一下其他人的:
DataSourceName:新建一个连接名,在ASP页面连接字符串时会使用此连接名。
TNSserviceName:IP/实例名,中间使用斜杆分隔。
User ID:数据库登录名。
点击“Test Connection”按钮,输入密码测试成功。个人觉得配置完这个,TNS_ADMIN是不是没用处,但没有验证。方式三没有使用ODBC,才有用TNS_ADMIN。
打开IIS,添加测试网站:
1.测试网站选择Classic .Net AppPool应用程序池
2.Classic .Net AppPool应用程序池启用32应用程序支持(True)
3.ASP开启调试属性,将错误发送到浏览器True
4.添加连接数据库测试页面,测试页面为UTF-8编码格式:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<% Response.Charset = "utf-8" %>
<%
Dim connStr
Dim conn,sql,rs
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=web32;UID=YCWEB;PWD=12345678;"
if err then
err.clear
set Conn=Nothing
Response.Write "数据库连接出错,"
Response.End
else
Response.Write "数据库连接成功,"
End If
sql = "select * from v_djkscjb where xh=201510300"
Set rs = conn.Execute(sql)
Do Until(rs.eof)
For i=0 to rs.fields.count-1
Response.Write (rs.fields(i))
Response.Write ("<br>")
Next
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
</body>
</html>
打开后报:驱动架构不符错误之类。
猜测:IIS和ASP是32位的,不能使用64架构驱动。于是转战方式二。
方式二:不完美。
首先,去ODBC源删除64位的系统DSN
卸载odbc的64位驱动,在C:\oracle目录下右键odbc_uninstall.exe以管理员运行。
清空C:\oracle下的所有文件。
Oracle官网下载的32位客户端和ODBC驱动:
instantclient-basic-nt-11.2.0.4.0
instantclient-odbc-nt-11.2.0.4.0
Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC 安全更新_x86
(odbc驱动要用到,微软这个挺难找,只能找到更新,但是适用)
客户端和驱动安装过程同64位。略。
创建ODBC:
开始-管理工具-数据源(ODBC)是64位的,肯定不行,32位的在这里:
C:\Windows\SysWOW64\odbcad32.exe
运行后配置和64位一样操作。
IIS配置同64位。
打开测试页面,显示连接成功。但,Oracle返回来的数据中包含中文,这些中文都乱码(变成????)。
苦苦切换编码,无法解决。但是网上有人遇到同样问题,言语间是通过换连接方式解决了中文乱码问题,但是没有给出具体方法。于是就网上寻找还有其他方式?就找到了方式三。
方式三:完美。
首先是找到OO4O ( Oracle Object For OLE ),但是oracle 11.2版本后就没有了。刚好我的是11.2,可以使用。但是本文最后没有使用这个。
因为网上搜索时找到这样一种方式:
set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
OraOLEDB引起了我的注意,搜索后是,这个是ODAC的一个组件。
Oracle 数据访问组件 (ODAC) 全称:Oracle Data Access Components。
ODAC Components:
Oracle Developer Tools for Visual Studio
Oracle Data Provider for .NET
Oracle Providers for ASP.NET
Oracle Database Extensions for .NET -- available in 12.2 and earlier for upgrade only
Oracle Provider for OLE DB
Oracle OLAP Provider for OLE DB -- 18c and higher
Oracle Services for Microsoft Transaction Server
Oracle ODBC Driver
Oracle SQL*Plus
Oracle Instant Client
其中有个组件,Oracle Provider for OLE DB。就是这个。
官方下载的是ODAC 11.2.0.3.20版本。多次搜索后发现官方还有ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy下载,ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy里面还有OO4O驱动,但是我们不使用这个。
当然,我们下载的都是32位的版本,因为最后已经成功,64位没有测试。
这次我使用的是ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy 32位。
里面的readme很详细告诉你怎么安装。
instantclient_11_2:这是Oracle客户端,所有组件的运行都依赖于这个客户端;
oledb:这是OLE DB组件
oo4o:是OO4O组件。
asp.net:这是ASP.NET2组件
asp.net4:这是ASP.NET4组件
odp.net4:这是.NET4组件
odp.net20:这是.NET2组件
oramts:这是Oracle的MTS服务
network:它是用来存放tnsnames.ora文件的,要安装后才能用。
首先,去ODBC源删除32位的系统DSN
卸载odbc的32位驱动,在C:\oracle目录下右键odbc_uninstall.exe以管理员运行。
清空C:\oracle下的所有文件。并去除相关环境变量设置。
在cmd中cd到这个目录:输入 install.bat all c:\oracle odac 省麻烦,安装了所有组件。
c:\oracle是安装目录,odac是写注册表用(名字任意)
单个组件这样装:
install.bat oledbc:\oracle odac false
这时就只会安装oledb,而不会把oledb和instantclient_11_2也装上。
创建环境变量(路径一样,上面也可不清除):
添加到系统的环境变量Path:C:\oracle;C:\oracle\bin
添加:TNS_ADMIN 值:C:\oracle\network\admin\tnsnames.ora
三种方式的tnsnames.ora都是一样的。
直接到了IIS这部,配置和其他方式都一样。
测试页面配置要修改:
<%
set conn=server.createobject("adodb.connection")
dns="Provider=OraOLEDB.Oracle;User ID=YCWEB;Password=12345678;Data Source=APPORCL"
conn.Open dns
SQL="select XH,XM,XN,XQ,KCMC,ZSCJ from v_ggdjkscjb where xh=201510300"
'学号XH,姓名XM,学年XN,学期XQ,课程名称KCMC,成绩ZSCJ
set rs=conn.execute(SQL)
Do Until(rs.eof)
For i=0 to rs.fields.count-1
Response.Write (rs.fields(i))
Response.Write ("<br>")
Next
rs.MoveNext
Loop
SQL2="select XH,XM,XN,XQ,KCMC,ZSCJ,BKCJ from v_cyyjb where xh=201510300"
'学号XH,姓名XM,学年XN,学期XQ,课程名称KCMC,期末成绩ZSCJ,补考成绩BKCJ
set rs2=conn.execute(SQL2)
Do Until(rs2.eof)
For i=0 to rs2.fields.count-1
Response.Write (rs2.fields(i))
Response.Write ("<br>")
Next
rs2.MoveNext
Loop
rs.Close
set rs=nothing
rs2.Close
set rs2=nothing
conn.close
set conn=nothing
%>
注意:Data Source=APPORCL,跟tnsnames.ora一样。
重启服务器。
重启服务器。
重启服务器。
打开测试页面,中文显示正常了。
三、总结:
ODBC不靠谱,
OO4O已退出,
OLEDB显示器。