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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容