盡管2020了,但是需求無處不在共虑,ASP連接Oracle數(shù)據(jù)庫問題的解決過程:
注意愧怜,本文為夢回大唐版本,盜圖嚴(yán)重妈拌,紕漏難免拥坛,歡迎舉報(bào)。
一尘分、環(huán)境
數(shù)據(jù)庫端:Windows Server 2008 R2 64位企業(yè)版 + Oracle 11.2.0.1.0 64位 企業(yè)版
客戶端:Windows Server 2008 R2 64位企業(yè)版 + IIS +ASP
二猜惋、連接Oracle
方式一:失敗。
Oracle官網(wǎng)下載的客戶端和ODBC驅(qū)動:
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
創(chuàng)建C:\oracle\network\admin\tnsnames.ora梨撞,內(nèi)容如下:
APPORCL =
? (DESCRIPTION =
? ? (ADDRESS_LIST =
? ? ? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.22.30)(PORT = 1521))
? ? )
? ? (CONNECT_DATA =
? ? ? (SERVICE_NAME = orcl)
? ? )
? )
右鍵odbc_install.exe以管理員運(yùn)行,安裝odbc驅(qū)動香罐。
創(chuàng)建環(huán)境變量:
添加到系統(tǒng)的環(huán)境變量Path:C:\oracle;C:\oracle\bin
添加:TNS_ADMIN 值:C:\oracle\network\admin\tnsnames.ora
創(chuàng)建ODBC:
(默認(rèn)運(yùn)行的是64位)開始-管理工具-數(shù)據(jù)源(ODBC)-系統(tǒng)DSN-添加-選擇剛安裝的instantclient驅(qū)動卧波。
配置圖,盜用一下其他人的:
DataSourceName:新建一個連接名庇茫,在ASP頁面連接字符串時(shí)會使用此連接名港粱。
TNSserviceName:IP/實(shí)例名,中間使用斜桿分隔旦签。
User ID:數(shù)據(jù)庫登錄名查坪。
點(diǎn)擊“Test Connection”按鈕,輸入密碼測試成功宁炫。個人覺得配置完這個偿曙,TNS_ADMIN是不是沒用處,但沒有驗(yàn)證羔巢。方式三沒有使用ODBC望忆,才有用TNS_ADMIN。
打開IIS竿秆,添加測試網(wǎng)站:
1.測試網(wǎng)站選擇Classic .Net AppPool應(yīng)用程序池
2.Classic .Net AppPool應(yīng)用程序池啟用32應(yīng)用程序支持(True)
3.ASP開啟調(diào)試屬性启摄,將錯誤發(fā)送到瀏覽器True
4.添加連接數(shù)據(jù)庫測試頁面,測試頁面為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 "數(shù)據(jù)庫連接出錯幽钢,"
Response.End
else
? ? Response.Write "數(shù)據(jù)庫連接成功歉备,"
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>
打開后報(bào):驅(qū)動架構(gòu)不符錯誤之類。
猜測:IIS和ASP是32位的匪燕,不能使用64架構(gòu)驅(qū)動蕾羊。于是轉(zhuǎn)戰(zhàn)方式二喧笔。
方式二:不完美。
首先龟再,去ODBC源刪除64位的系統(tǒng)DSN
卸載odbc的64位驅(qū)動溃斋,在C:\oracle目錄下右鍵odbc_uninstall.exe以管理員運(yùn)行。
清空C:\oracle下的所有文件吸申。
Oracle官網(wǎng)下載的32位客戶端和ODBC驅(qū)動:
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驅(qū)動要用到梗劫,微軟這個挺難找,只能找到更新截碴,但是適用)
客戶端和驅(qū)動安裝過程同64位梳侨。略。
創(chuàng)建ODBC:
開始-管理工具-數(shù)據(jù)源(ODBC)是64位的日丹,肯定不行走哺,32位的在這里:
C:\Windows\SysWOW64\odbcad32.exe
運(yùn)行后配置和64位一樣操作。
IIS配置同64位哲虾。
打開測試頁面丙躏,顯示連接成功。但束凑,Oracle返回來的數(shù)據(jù)中包含中文晒旅,這些中文都亂碼(變成????)。
苦苦切換編碼汪诉,無法解決废恋。但是網(wǎng)上有人遇到同樣問題,言語間是通過換連接方式解決了中文亂碼問題扒寄,但是沒有給出具體方法鱼鼓。于是就網(wǎng)上尋找還有其他方式?就找到了方式三该编。
方式三:完美迄本。
首先是找到OO4O ( Oracle Object For OLE ),但是oracle 11.2版本后就沒有了课竣。剛好我的是11.2嘉赎,可以使用。但是本文最后沒有使用這個稠氮。
因?yàn)榫W(wǎng)上搜索時(shí)找到這樣一種方式:
set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
OraOLEDB引起了我的注意曹阔,搜索后是半开,這個是ODAC的一個組件隔披。
Oracle 數(shù)據(jù)訪問組件 (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版本。多次搜索后發(fā)現(xiàn)官方還有ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy下載鬓长,ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy里面還有OO4O驅(qū)動谒拴,但是我們不使用這個。
當(dāng)然涉波,我們下載的都是32位的版本,因?yàn)樽詈笠呀?jīng)成功,64位沒有測試跺株。
這次我使用的是ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy 32位宅楞。
里面的readme很詳細(xì)告訴你怎么安裝。
instantclient_11_2:這是Oracle客戶端窗声,所有組件的運(yùn)行都依賴于這個客戶端相恃;
oledb:這是OLE DB組件
oo4o:是OO4O組件。
asp.net:這是ASP.NET2組件
asp.net4:這是ASP.NET4組件
odp.net4:這是.NET4組件
odp.net20:這是.NET2組件
oramts:這是Oracle的MTS服務(wù)
network:它是用來存放tnsnames.ora文件的笨觅,要安裝后才能用拦耐。
首先,去ODBC源刪除32位的系統(tǒng)DSN
卸載odbc的32位驅(qū)動见剩,在C:\oracle目錄下右鍵odbc_uninstall.exe以管理員運(yùn)行杀糯。
清空C:\oracle下的所有文件。并去除相關(guān)環(huán)境變量設(shè)置苍苞。
在cmd中cd到這個目錄:輸入 install.bat all c:\oracle odac 省麻煩火脉,安裝了所有組件。
c:\oracle是安裝目錄柒啤,odac是寫注冊表用(名字任意)
單個組件這樣裝:
install.bat oledbc:\oracle odac false
這時(shí)就只會安裝oledb倦挂,而不會把oledb和instantclient_11_2也裝上。
創(chuàng)建環(huán)境變量(路徑一樣担巩,上面也可不清除):
添加到系統(tǒng)的環(huán)境變量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"
'學(xué)號XH,姓名XM,學(xué)年XN,學(xué)期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"
'學(xué)號XH,姓名XM,學(xué)年XN,學(xué)期XQ,課程名稱KCMC,期末成績ZSCJ,補(bǔ)考成績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一樣。
重啟服務(wù)器拳话。
重啟服務(wù)器先匪。
重啟服務(wù)器。
打開測試頁面弃衍,中文顯示正常了呀非。
三、總結(jié):
ODBC不靠譜,
OO4O已退出岸裙,
OLEDB顯示器猖败。