标签 ASP 下的文章

Oracle OraOLEDB错误解释

最近需要将以前的老代码(ASP+ORACLE)环境配置起来。过程中又碰到了很多OraOLEDB的问题。

Server.CreateObject 失败

以前连接oracle 10g,用的以下代码,那是09年的事情了。手头没有oracle 10g win32安装包。oracle今日(2013年)也不再提供10g下载了。只有下载了11g。win32,win64两个都下载了。打开网页报错:

Server 对象 错误 'ASP 0177 : 800401f3' 

Server.CreateObject 失败 

/conn.asp,行 5 

800401f3 

以下是代码:

ConnectStr="Provider=OraOLEDB.Oracle.1;Data Source=orcl;User ID=test;Password=123"
set Conn = server.createobject("myCls.Login")
Conn.open connectstr

经过多次尝试,修改为以下object字符串搞定:

set Conn = server.createobject("adodb.connection")

ORA-12541: TNS: 无监听程序

报错信息:

OraOLEDB 错误 '80004005' 

ORA-12541: TNS: 无监听程序 

/conn.asp,行 9 

这个是因为没有打开Oracle监听程序(OracleOraDb11g_home1TNSListener)造成。

TNS: 监听程序无法分发客户机连接

OraOLEDB 错误 '80004005' 

ORA-12518: TNS: 监听程序无法分发客户机连接 

/conn.asp,行 9 

OracleOraDb11g_home1TNSListener服务开启了,但是OracleServiceORCL没有开启

invalid username/password; logon denied

OraOLEDB 错误 '80004005' 

ORA-01017: invalid username/password; logon denied 

/conn.asp,行 9 

登录用户名或密码错误,要么是无此用户,要么是密码错误。

表或视图不存在

OraOLEDB 错误 '80004005' 

ORA-00942: 表或视图不存在 

/login.asp,行 40 

没有找到table or view

Server.MapPath虚拟路径(virtual path)和相对路径(relative path)

早上来上班没多久,某客服的网站出了问题,返回500 Internal Server Error。地址:http://xxx.com/plus/xx.asp

Server.MapPath虚拟路径(virtual path)和相对路径(relative path)

很明显一看就知道是数据连接字符串出了问题,跳转到conn.asp ,
上面的定义:

If DataBaseType=0 then
'如果是ACCESS数据库,请认真修改好下面的数据库的文件名
DBPath = "xx_Data/xxxx.mdb" 'ACCESS数据库的文件名,请使用相对于网站根目录的的绝对路径
SqlNowString = "Now()"
Else
'如果是SQL数据库,请认真修改好以下数据库选项
DataServer = "(local)" '数据库服务器IP
DataUser = "sa" '访问数据库用户名
DataBaseName = "xx" '数据库名称
DataBasePsw = "xx" '访问数据库密码
SqlNowString = "getdate()"
End if

下面的打开数据库的子过程:

Sub OpenConn()
'On Error Resume Next
If DataBaseType = 1 Then
ConnStr="Provider = Sqloledb; User ID = " & datauser & "; Password = " & databasepsw & "; Initial Catalog = " & databasename & "; Data Source = " & dataserver & ";"
Else
ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(DBPath)
End If
Set conn = Server.CreateObject("ADODB.Connection")
conn.open ConnStr
If Err Then Err.Clear:Set conn = Nothing:Response.Write "数据库连接出错,请检查Conn.asp文件中的数据库参数设置。":Response.End
CollcetConnStr ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(CollectDBPath)
End Sub

可以发现DBPath这个变量里面的路径前面是没有“/”或者“\”符号,说明是相对路径,关于Server.MapPath的路径,我们来看官方解释:

Syntax
Server.MapPath( Path )

Parameters
**Path **

Specifies the relative **or **virtual **path to map to a physical directory. If Path starts with either a **forward (/) or backward slash (), the MapPath method returns a path as if Path is a full virtual path. If Path doesn't start with a slash, the MapPath method returns a path relative to the directory of the .asp file being processed.

上面的DBPath很明显被当作了relative path,路径都是相对于当前运行的asp文件路径,这样的定义在开发设计中是不可取的,最好统一为virtual path,虚拟路径就好象是由一个网站根目录开始的绝对路径。

当然这个整个问题的发生是客户小心去掉了forward (/) or backward slash ()。加上后网站正常打开。

ASP Application对象

通过 Application 对象进行事件处理, 相关代码放在虚目录的 Global.asa 文件中, 代码如 下:

sub application_onstart
end sub sub

session_onstart
application("dsn")="driver=sql server;server=(local);uid=sa;pwd=;database=sell"
end sub

sub session_onend
end sub sub

application_onend
end sub