分类目录归档:ASP

都快被遗忘的技术,由于开发速度快,依然有小众用户群。

asp多维数组redim报错:下标越界

搜索:百度知道结果:
Dim p() As Byte
ReDim Preserve p(3, 1)
ReDim Preserve p(4, 1)
使用 Preserve,只能调整数组最后一维的大小。
Dim p() As Byte
ReDim Preserve p(1, 3)
ReDim Preserve p(1, 4)

Dim p() As Byte
ReDim p(3, 3)
ReDim p(2, 4)
都是正确的。
只有上面2种定义是正确的,这是VB规定的。
解决方法可以定义成最后一维可变,其他维不变的形式:
ReDim Preserve p(1, 3)
ReDim Preserve p(1, 4)
如果实在定义不了的话,利用临时数组存储数据,然后不用Preserve,再把临时数组数据转回P数组:
Dim p() As Byte ,dim q() as byte
ReDim Preserve p(3, 1)
redim q(3,1)
…’p数组数据转至Q数组中
ReDim p(4, 1)
…’Q数组数据转至回P数组中。

Response.Redirect、Server.Transfer的区别

在实现页面跳转的时候,有些人喜欢用Response.Redirect,而有些人则喜欢用Server.Transfer。大部分时间似乎这两种方法都可以实现相同的功能,那究竟有区别吗?
查了些文档,发现两者区别还是很明显的。根本上,Response是叫浏览器去重新转向到指定的网页,而Server自然是发生在服务器端为主了,因此会有以下区别:
1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活;
2. Server.Transfer可以将页面参数方便传递到指定页面;
3. 使用时,Server.Transfer跳到别的页面后,浏览器显示的地址不会改变,有时反而会造成误会,当然也有些场合需要这样的效果;
4. Server.Transfer可以减少客户端对服务器的请求;
用Server.Transfer迁移到另一个页面保持着服务资源。 而不是简单的通知浏览器服务端换了个页面并迁移请求。这意味着你不需要携带更多的Http请求,因此可以减轻服务端的压力而使你的应用运行得更快。
但是,注意:因为”Transfer”过程只能在那些在同一服务端的站点上,你不能使用Server.Transfer使用户跳转到外部的站点。这点只有Response.Redirect能做到。
第二,Server.Transfer维持着浏览器原始的URL,这对于流线型的数据入口技术,虽然它有可能导致调试的时候的数据混乱
还有,Server.Transfer方法还有二个参数的重载方法——”preserveForm”如果你将其设置为True(默认情况是False),使用一个状态比如:Server.Transfer(“WebForm2.aspx”, True),现存的请求字符串和所有的Form里的变量将被保持并提交到你的目标页。
但是必须注意的是,这里有一个奇怪的Bug(微软为什么有这样的Bug)。当你使用两个参数的重载方法试图迁移form和请求字符串的时候会有可能产生错误。
非官方的解决办法是将要被跳转的画面的enableViewStateMac的属性设置为 True , 然后再设回 False.

解决IIS7运行ASP特别慢问题

装了WIN7,iis版本是7.0了,架设好了环境,绑上以前的ASP程序之后,发现运行巨慢,查看各项设置,均无错误,无奈Google之,得到答案:
更改MSSQL连接语句:

Provider=Sqloledb;User ID=数据库帐号;Password=数据库密码;Initial Catalog=数据库名;Data Source=数据库IP;

更改为

Driver={SQL SERVER}; Server=数据库IP;UID=数据库帐号;PWD=数据库密码;Database=数据库名;

完事了,运行速度比WIN2003+iis6还快不少。

msxml3.dll错误,80070005拒绝访问解决方法

msxml3.dll错误,80070005 此问题一般出现在“采集程序”中。没错,本人的采集程序就出现了这样的错误。
方案一、适合对服务器有绝对管理权限者
解决办法:
赋予程序所在文件夹 internet 来宾帐号(IUSR_WEB)可写。
做法:
选择cachefile-属性-安全-添加(IUSR_WEB)-写入
方案二、更改程序(推荐方案)
用Msxml2.ServerXMLHTTP替换掉Microsoft.XMLHTTP
详细:昨天在采集某一个网站的时候,采集程序出错了。
是自写的采集程序。
经过搜索以后,查到一些没有用的结果,后来发现,用Msxml2.ServerXMLHTTP替换掉Msxml2.XMLHTTP,问题成功解决。
以下是分析排错过程。
老是采集一段时间就挂了,指定资源下载失败,或者拒绝访问。
后来直接全部是拒绝访问。
一开始,认为,对方服务器做了防采集设置,比如有时间限制之类的。
于是更改程序,原先是直接获取列表页,然后持续循环获得文章列表。改了采集文件结构,
原来是就一个文件,类,数据库连接,数据处理全部在一个文件里,再采集某一篇文章的时候,后天加了一个时间循环。等待5秒的。代码如下
sTime=Timer()
dTime=Timer()-sTime
do while dTime < 5
dTime=Timer()-sTime
loop
确实是能等待5秒钟,但是很快就发现,这个循环太过消耗CPU资源,一到这个循环,CPU占用率持续100%,于是马上放弃这个方案。
另做了一个文件。只根据文章URL抓取文章的相关内容并写入数据库,写入完毕后输出自动跳转代码。
核心思想就是用了
这是一个定时跳转的代码,相信大家都很熟悉。
我的原理做法就是,用一开始的文件,抓取所有的文章连接地址,以及相关导航代码,保存到数据库中。
然后用新做的抓取文章内容的程序,读取数据库记录,逐条进行采集。
数据库记录中有一个flag标记,tinyint类型,默认是0,采集成功更新为1,失败更新为2
这样,每次从数据库中读取一条未采集的数据,也就是读取flag=0的数据,进行操作。操作完毕等待5秒跳转到自身。
想法跟思路是很好的。文章URL数据库也采集准备好了,一上采集文章具体内容,又出错了。一直是msxml3.dll 错误 ‘80070005’
拒绝访问的错误。
那个郁闷,想开一晚上机器,自动采集,破灭。
今天早上来搜索查询资料,查询到的绝大多数都是无用信息。
基本上都是说权限问题。
msxml3.dll 错误 ””80070005””
拒绝访问。
解决办法:
赋予程序所在文件夹 internet 来宾帐号(IUSR_WEB)可写。
做法:
选择cachefile-属性-安全-添加(IUSR_WEB)-写入
都是这么说的。莫名其妙的,我的是FAT32的不存在NTFS格式的那种安全权限问题,IIS设置也正常,
我的问题是采集一部分就拒绝访问。肯定不是这个问题。
继续搜索,找到另一个方案说是,用Msxml2.XMLHTTP替换掉Microsoft.XMLHTTP,我本来用的就是Msxml2.XMLHTTP的
继续搜索。找到最终解决方案应该是用Msxml2.ServerXMLHTTP
其实有时候问题很显然,但是ASP的错误提示做不到那么详细。比如我自己的网站,知道是因为网络访问超级慢出现的错误,它却给出msxml3.dll出错的提示。木然!
 
 

错误:ASP 0156 : 80004005

今天一客户联系我说使用的网站添加新闻等操作时候突然报错,提示为
答复对象 错误 ‘ASP 0156 : 80004005’
头错
/nanraocheng/news/admin_news_add_save.asp,行146
HTTP头已经写入到客户浏览器。任何 HTTP 头的修改必须在写入页内容之前。
到达现场后调试发现该ASP程序在本机调试错误,上传后即出现改错误,检测后得出结论为缓冲输出的错误,解决方法及原理如下:
原因是
iis5.0   默认使用网页缓存,pws或iis4.0(winnt系统)   默认不使用网页缓存   。
所以<%response.buffer   =   true%>放在顶部或response.redirect   语句放在任何html语句前面。即在使用Response.Redirect之前不要输出任何客户端(Browse)的   HTML   或   Script!
一般都是在最前面加上 <%response.buffer=true%>
 

使用ASP的Scripting.Dictionary对象打造完美购物车

一直不习惯用Dictionary,但是有时候却很有用。
Dictionary 对象
Dictionary 对象用于在结对的名称/值中存储信息((等同于键和项目)。Dictionary 对象看似比数组更为简单,然而,Dictionary 对象却是更令人满意的处理关联数据的解决方案。
比较 Dictionary 和数组:

  • 键用于识别 Dictionary 对象中的项目
  • 无需调用 ReDim 来改变 Dictionary 对象的尺寸
  • 当从 Dictionary 删除一个项目时,其余的项目会自动上移
  • Dictionary 不是多维,而数组是
  • Dictionary 与数组相比,有更多的内建对象
  • Dictionary 在频繁地访问随机元素时,比数组工作得更好
  • Dictionary 在根据它们的内容定位项目时,比数组工作得更好

Dictionary 对象的属性和方法描述如下:

属性
CompareMode:设置或返回用于在 Dictionary 对象中比较键的比较模式。
Count:返回 Dictionary 对象中键/项目对的数目。
Item:设置或返回 Dictionary 对象中一个项目的值。
Key:为 Dictionary 对象中已有的键值设置新的键值。
方法
Add:向 Dictionary 对象添加新的键/项目对。
Exists:返回一个逻辑值,这个值可指示指定的键是否存在于 Dictionary 对象中。
Items:返回 Dictionary 对象中所有项目的一个数组。
Keys:返回 Dictionary 对象中所有键的一个数组。
Remove:从 Dictionary 对象中删除指定的键/项目对。
RemoveAll:删除 Dictionary 对象中所有的键/项目对。

<%
Dim oDic,aItems,aKeys 
Set oDic = Server.CreateObject("Scripting.Dictionary")  '添加 
oDic.Add "aaa",111 
oDic.Add "bbb",222 
oDic.Add "ccc",333 
oDic.Add "ddd",444  '修改 
If oDic.Exists("aaa") Then 
  oDic.key("aaa") = "eee" 'key属性,只读 
  oDic.item("eee") = 555 'item属性,可读写 
End If  '列表 
aKeys = oDic.Keys 
aItems = oDic.Items
For i=0 To oDic.Count-1 
 Response.Write(aKeys(i) & "," & aItems(i)) 
Next  '删除 
Response.Write(oDic.Count) 
oDic.Remove("eee") '从 Dictionary 对象中删除键和项目对 
Response.Write(oDic.Count) 
oDic.RemoveAll() '删除 Dictionary 对象中的所有键和项目对 
Response.Write(oDic.Count)
Set oDic = Nothing
%>

购物车具体用法:

1、为客户建立购物车,名为shop
set session(“shop”)= CreateObject(“Scripting.Dictionary”)
2、检查客户当前购物车商品个数
session(“shop”).count=0
如果为0,那么自然表示购物车现在是空的
3、客户订购某一商品
session(“shop”).add id,num
id表示数据库中商品的ID或编号等,num表示客户订购此商品的
个数
4、客户查看购物车列表(客户确认当前已购买了的商品列表)
id=session(“shop”).keys
num=session(“shop”).items
以上2句均返回的是数组型数据,分别付给id(商品ID组)和num(
商品数量组)这2个变量
聪明的你马上就会想到只要通过循环把它们一一对应起来就OK了:
for i=0 to session(“shop”).count-1
…id(i)
…这里可以结构操作数据库把商品的信息取出来,通过操作商品编
号数组id(i)
do while not rs.eof
…num(i)
…然后循环结果集,使价格等与商品对应,通过操作商品个数数组
num(i)
rs.movenext
loop
next
数组的下标是从0开始,所以要count-1哦
这部可能有点乱,不过如果你有点经验的话应该是很容易读懂的。
5、客户更改某一商品的订购数量
session(“shop”)(id)=num
太简单了,我不多解释了。
6、客户删除某一商品
session(“shop”).remove(id)
7、客户清空购物车
session(“shop”).removeall
 

ASP读取xls格式的Excel文件

Excel也是一种数据库,跟Access类似,其读取方法也类似。
这里有一个简单的Excel表,文件名字为Excel.xls:

咱就这个为例子来说明。
创建Excel连接代码:

Dim XlsConn,xrs
Set XlsConn=Server.CreateObject("Adodb.Connection")
XlsConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("Excel.xls")&";Extended Properties=Excel 8.0"

是不是跟连接Access文件很像呢?呵呵~
连接创建好了,就可以创建记录集查询Excel里面的数据了。

Set xrs=XlsConn.Execute("Select * From [Sheet1$]")

跟其他数据库的查询几乎是一样的,要注意的地方就是表名,Excel里面,默认会有三张表,Sheet1、Sheet2、Sheet3,从上面的例子也可以看到,需要注意查询时表名后面要加“$”符;查询结果:

xrs(0)="数据列0"
xrs(1)="1"
xrs(2)="2"
xrs(3)="3"
xrs(4)="4"
xrs(5)="5"

这里有一点需要注意,如果一列中有多行,有的行的值是数字,有的行是字符,ASP去取值的时候数字行会读取出错,是为空的。所以得想办法把数字行也变成字符型,比如加个’号去,读取出来之后再替换回去。
 
多行自然是用xrs.Movenext去循环取得了。够简单吧!
最后贴一段代码:

Dim rs
Set rs=Server.CreateObject("Adodb.Recordset")
rs.Open "Select Top 1 * From Pro Where 1=2",Conn,3,2
Dim XlsConn,xrs
Set XlsConn=Server.CreateObject("Adodb.Connection")
XlsConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("Excel.xls")&";Extended Properties=Excel 8.0"
Set xrs=XlsConn.Execute("Select * From [Sheet1$]")
Do While Not xrs.Eof
rs.Addnew
rs("iClear")= xrs(0)
rs("Detail")= xrs(1)
rs.Update
xrs.Movenext
Loop
xrs.Close()
Set xrs=Nothing
XlsConn.Close()
Set XlsConn=Nothing
rs.Close()
Set rs=Nothing

The system cannot locate the resource specified.

ASP网站采集程序用的好好的,今天突然出现这问题。本地能正常采集,就是服务器上死活不让采。

The system cannot locate the resource specified.

这个是捕捉到的Err.Description提示。程序如下:

Set xmlHttp = CreateObject("Msx"&"ml2.XM"&"LHT"&"TP.6.0")
xmlHttp.Open "POST", PostUrl, False 
XmlHTTP.setRequestHeader "Content-Length",Len(PostData)  
xmlHttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded" 
xmlHttp.setRequestHeader "Referer", RefererUrl
xmlHttp.Send PostData

Google之,错误原因及其解决方法有不少,罗列一下:

(一)那就是最基本的了,你的服务器不支持xmlhttp或组件版本态低,需要下载相应的组件。这个一般服务器都不需要的,大多数情况下都支持xmlhttp,所以这个情况较少。
(二)msxml3.dll文件可能损坏或该文件使用权限不够(权限这个情况可能性较小),如果是文件损坏的话,你可以到网上下载相应系统环境的msxml3.dll文件替换下(2003系统好像在c:windowssystem32下),需要关闭相应的服务例如iis等才能覆盖。
(三)防火强或杀毒软件禁用了相应的端口,具体该怎么设置要根据不同的软件而定,你可以试着关闭防火墙或杀毒软件后再测试确定是否是这个问题。
(四)重新注册下该组件试试看。开始>>运行: regsvr32 msxml3.dll
(五)DNS解析错误,检查你的网络设置或正确的域名解析访问
(六)检查你的IP筛选的设置(这个不是太了解)
(七)对方资源失效,比如采集某条信息时,对方该条信息不存在导致程序终止错误,也可能是这种情况。这种错误都是出现在调用了 xmlhttp 组件的 Open方法,接着再用Send方法后造成的。当open方法的的 url 参数无法访问时,就会造成 8000005 错误。并且一旦产生这种错误,就会导致应用程序终止,无法继续操作。
(八)进入服务器设置您的IE安全选项(把等级设中或低试试看),在受信任网站里加入您要获取的域名即可。
(九)去微软下载了MSXML 4.0 Service Pack 2 (Microsoft XML Core Services)和Hotfix for MSXML 4.0 Service Pack 2 – KB832414 – 简体中文(KB832414_MSXML4.0_x86.exe)安装后,问题解决了!

仔细看了一下,貌似讲的都跟我这不一样,因为我同个服务器另外一个采集程序能正常采集。于是上服务器上查看,期待能找到点端倪。
将采集网站的网址放服务器上浏览器运行,居然打不开。猜测应该是对方把我的IP给屏蔽掉了。
知道原因就好办了,于是本地采集数据,然后远程插入服务器数据库。搞定。 本地的IP是动态的,每天都变,看你怎么屏蔽,要想彻底搞定我,他只能修改网站代码不让采集了。
道高一尺,魔高一丈~! 嘿嘿~

ASP '80020009' 错误及其解决办法

CSDN 文档中心发表文章的时候,大的,用Word转过来的文章经常会报以下错误:
 错误 ‘80020009’
发生意外。
/Develop/add_sql.asp,行25
今天在把Access里面的数据转到SQL2000里面去,然后再生成静态页面的时候也出现了这样的问题。
而这里第25行的代码只是:
m_Develop_content = Trim(Request.Form(“content”))
这里只是接受数据。应该不是代码的问题。在CSDN搜索了相关帖子,这样的错误也不少,基本上都没有答案,在看到一个帖子的时候,发现有个人说,这是因为iis默认设置中最大只能接受200K的内容。是这里造成的原因。
http://expert.csdn.net/Expert/topic/2100/2100898.xml

 
IIS6 可以做以下调整。
先在服务里关闭iis admin service服务
找到windowssystem32inesrv下的metabase.xml,
打开,找到ASPMaxRequestEntityAllowed 把他修改为需要的值,默认为204800,即200K
然后重启iis admin service服务
把它修改为51200000(50M)
IIS5.0/4.0 在注册表内 –
Description of the MaxClientRequestBuffer Registry Value
http://support.microsoft.com/?id=260694

Default Sizes in IIS 4 and 5

In IIS 4.0, the default maximum size of request line and header fields is 2 megabytes (MB).
In IIS 5.0, this is reduced to 128 kilobytes (KB).
In IIS 5.0 with Windows 2000 Service Pack 4 installed, this is reduced to 16 KB.
 
另外,在搜索微软的知识库的时候,发现在数据类型是text BLOB 的读取处理的时候,也有80020009错误
 
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q175/2/39.asp&NoWebContent=1

When dealing with BLOB fields from Microsoft SQL Server, you must put them to the right of non-BLOB columns in the resultset. To be safe, you should also read the columns in left-to-right order, so if you have two BLOB columns as the last two columns in your resultset, read the first one and then the second. Do not read them in the reverse order.
数据读取的先后顺序,竟然也会出现这个问题。
看了这么多资料,不解。觉得我这个错误不应该是这些原因造成的。仔细检查代码,发现原来是记录集被我提前关闭了。修改、搞定!
So easy~!