美文网首页
2020:ASP连接Oracle数据库问题的解决过程

2020:ASP连接Oracle数据库问题的解决过程

作者: Eason9024 | 来源:发表于2020-03-12 12:33 被阅读0次

尽管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显示器。

相关文章

网友评论

      本文标题:2020:ASP连接Oracle数据库问题的解决过程

      本文链接:https://www.haomeiwen.com/subject/stcujhtx.html