在画完效果图,就是写XHTML页面了,只是写用DW写的好慢………
写了几年的静态页,发现很多东西都是重复写重复写,可不可以不用写?而是看图(效果图)填参数即可?
以上只是最简单的想法,其实还可以做得更智能,比如往FW的切图方面去想…..
2:8定律又叫“马特莱法则”,如果你是企业领导而不知道2:8定律,那么…….OHZ,请仔细学习2:8定律,一定会对你有所帮助。
“马特莱法则”是19世纪末20世纪初的意大利经济学家和社会学家维弗烈度·帕累托提出的。经过长期的研究发现:在任何特定群体中,重要的因子通常只占少数,而不重要的因子则占多数,只要能控制具有重要性的少数因子即能控制全局。经过多年的演化,这个原理已变成当今管理学界所熟知的“80/20”定律–即80%的价值是来自20%的因子,其余20%的价值则来自80%的因子。它的要旨在于将20%的经营要务,明确为企业经营应该倾斜的重点方面,从而,指导企业家在经营中收拢五指捏成拳,突出重点,全力倾斜,以此来牵住经营的“牛鼻子”,带动企业经营的各项工作顺势而上,取得更好成效。
事实证明,那种“脚踩两只船”、“鱼和熊掌均可兼得”的理念和做法,势必稀释企业资源,分散企业精力,导致企业在漫长的战线上元气大伤,而最终被无情的市场淘汰出局。抓住了“20%”,牵住了“牛鼻子”,你就能取得经营的巨大成功。
永远记住2:8定律就是:20%的人占着世界上80%的财富,而80%的人只占有世界20%的财富,同样企业里20%优秀员工带来企业80%的利润,而80%的人只给公司带来20%的收入。 抓住了这20%,也就抓住了财富。
除了IE浏览器不可用,以下:
<!–[if !IE]> <–><link href=”no-ie.css” rel=”stylesheet” type=”text/css”><!–> <![endif]–>
ie6,7不执行以下代码
<!–[if gt IE 7]> <–><link href=”cool-browser.css” rel=”stylesheet” type=”text/css”><!–> <![endif]–>
用法:
<!–[if lt IE 8]>
code here
<![endif]–>
解释语句如下:
gt = selects greater than(高于)
lt = selects less than(低于)
gte = selects greater than or equal to(>=)
lte = selects less than or equal to(<=)
! = selects everything except what directly follows the “!”(选择所有,除了!)
实际应用:
选择IE5.01版,可以用”<!–[if ie 5.0]>”
或者”<!–[if Ite ie 5.0]>”
或者”<!–[if !gt ie 5.0]>”
或者”<!–[if lt ie 5.0000]>”
或者”<!–[if !gte ie 5.5000]>”
选择IE5.5,IE6.0,IE7.0,可以用”<!–[if !ie 5.0]>”
或者”<!–[if gt ie 5.0]>”
或者”<!–[if [...]
由于网站结构简单,2个通宵就弄好了~
网站名称:“帮你淘”
建站目的:帮广大网友门挑选好的淘宝宝贝
网站分类:淘宝女装、淘宝男装、淘宝手机、淘宝内衣、淘宝美容品、淘宝茶艺等
空闲玩玩我的“帮你淘”
由于暂无内容,稍后给出访问地址,呵呵~
很多人都喜欢在设计LOGO之前,想着要让LOGO传达什么寓意什么精神什么文化。其实大多数时候,不必去为这个事儿瞎操心,完全可以把流程倒过来:等LOGO出来后,再把LOGO和想要的寓意、精神、文化扯在一块儿。会发现,乳沟是挤出来的,故事是编出来的,传说是扯出来的!
DOG FUCK~~~
因为不喝酒了嘛,呵呵!在淘宝找了家茶具店,不错哟~!~~
记录下地址先:
幸福一家陶瓷馆:http://xfhome.taobao.com/
友茗堂:http://teaship.taobao.com/
宜兴方园紫砂:http://fyzs.taobao.com/
贺州东臣科技有限公司与贺州工兵室内装饰设计已整合为:东臣联合
我还是走我一贯的风格,简洁、明了….
LOGO寓意嘛,其实真没啥寓意,呵呵,只是我觉得这样设计,会让人看的清楚,容易记而已!看成品:
在制作中,我做了几个效果,但是都觉得看上去很没有一体性,总是那个大那个小的,但我是用标尺量着做的,宽和高每个字都一样………….怎么会这样呢?费解…..,做位子上起来,远离显示器1米多,看效果,呵呵,被我发现了…………前面为什么不好看,是因为太瘦了……..每个字都是用钢笔哗的,有很多细小的细节没注意要,比如线条的宽度啦之类的,看以下烂图:
修改了几处:
1、“东”字的竖钩改为有点弧度的
2、太瘦了,不够大方,把字的宽度整体拉宽
3、太过平…没啥突出点..所以“东”的出头处提升了几个像素,以及“联”字的偏旁的竖拉出长了….PS:会不会太长啊?呵呵
4、“联”字上的亮点,改为直直的…..呵呵~
总结完毕…
/** 清除内外边距 **/
body, h1, h2, h3, h4, h5, h6, hr, p,
blockquote, /* structural elements 结构元素 */
dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
pre, /* text formatting elements 文本格式元素 */
form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */
th, td, /* table elements 表格元素 */ [...]
本教程实现的是网站有新信息更新的提示,就像短信息一样,当有人给你短信息的时候,能够及时地通知你,
index.htm
<style>
#aaa1{font-size:12px;}
</style>
<BODY>
<div id=”aaa1″>新短信息共有0条</div>
<div id=”time” style=”display:none”>2000-1-1</div><a href=”#” onclick=”javascript:f()” style=”font-size:12px;”>查看</a> <a href=”inserurl.asp” target=”_blank” style=”font-size:12px;”>添加</a>
<script language=”javascript” src=”index.js”></script>
<script language=”javascript”>
window.setInterval(“checktime()”,5000);//每5秒钟检测一次
</script>
</BODY>
原理是:
1、首先给定一个时间time:2000-1-1 这是一个过去的时间,然后利用ajax去检测数据库中时间超过此时间的值,即为新信息。
2、为了及时地显示,采用的每时5秒钟检测一次数据库,找到那些超过time时间的记录为新信息,如果你要将它改成聊天室,测需要将时间设置的更小一些
3、点击查看后,需要将当前时间赋值给time,以后超过这个时间的信息为新信息。
4、添加实现的是更新数据库中的内容
本来以为asp链接sql server2005和sql server2000一样,结果用2000的代码,就是不成功。然后去网上找了半天,才找到一个可以正确使用的代码:
<%
Set conn = Server.CreateObject(“ADODB.Connection”)
strconn=”Provider=SQLOLEDB;uid=sa;pwd=123456;Server=(local);DATABASE=dbname”
conn.Open strconn
%>
asp连接mssql数据库代码
< %
Set conn = Server.CreateObject(“ADODB.Connection”)
strconn=”Provider=SQLOLEDB.1;Persist Sercurity Info=True;User ID=用户名;PWD=密码;Initial Catalog=数据库名;Data Source=(数据库地址,本机使用local,远程使用IP地址)”
conn.open strconn
% >
大家都知道ASP当中,最常用到的是ACCESS和MSSQL两个数据库。很多程序都想开发成两个数据库都可以使用的模式,但是碍于两个数据库得一些SQL语句不一致,所以导致很多程序都分两个没有必要的版本,就是ACCESS和MSSQL版!而事实上,我们可以通过对代码判断和识别,控制整个程序的兼容性。也就是说,将两个版本兼容成一个系统。例如我的ASP飞云小说系统,就是两种数据库都可以运作的程序。
那么,到底如何让程序存在数据库兼容性并且得到高效的运作呢。下边我将以我的飞云小说系统做范例,说说我的一些控制方法和代码。
首先,我们要控制一个参数,让程序知道我们现在运作的是什么数据库。
如:飞云小说程序中的Config.asp文件参数
以下为引用的内容:
Const SystemDatabaseType = “ACCESS” ‘系统数据库类型,”SQL”为MSSQL 2000/2005数据库,”ACCESS”为MS ACCESS 2000数据库
这是兼容性开始的基础,是整个程序数据库的判别。所以是非常有必要设置这么一个参数的。
第二,数据库连接方式和常用函数的区分
在我的程序当中,Conn.asp里边还存在下边的一段代码:
代码:
If SystemDatabaseType = “SQL” Then
ConnStr = “Provider = Sqloledb; User ID = ” & SqlUsername & “; Password = ” & SqlPassword & “; Initial Catalog = ” & SqlDatabaseName & “; Data Source = ” & SqlHostIP & “;”
FY_True = “1″
FY_False = “0″
FY_Now [...]
PS:是否可以使用到ASP版本的进销存上呢?
下面为代码:
以下为引用的内容:
<!–#include file=”../conn.asp”–>
<%
if session(“china_admin”)=”” then response.redirect “login.asp”
dbpath=”../”
dblink
dim filename,fs,myfile,x,m,n,o,link
Set fs = server.CreateObject(“scripting.filesystemobject”)
Set rs = Server.CreateObject(“ADODB.Recordset”)
session(“sql”) = “select * from china_car”
rs.Open session(“sql”),conn,1,1
n=1
‘==================================================================
‘==============================================================建立excel文件系统
filename = Server.MapPath(“car/CarTable”&n&”.xls”) ‘这个是为了方便,新建一个CAR的文件夹,这个可以自己设啦
if fs.FileExists(filename) then’如果文件存在,覆盖它。
fs.DeleteFile(filename)
end if
set myfile = fs.CreateTextFile(filename,true)
‘========================================================================
dim strLine,responsestr
strLine=””
dim work,j,i
str=”序号|卡号|密码|积分数|金额” ’这个根据你的access数据表字段设置。
work=split(str,”|”)
j=ubound(work)
i=0
o=0
do while not i>j
strLine= strLine & work(i) & chr(9)
i=i+1
loop
myfile.writeline strLine
Do while Not rs.EOF
o=o+1
m=20000
strLine=””
for each x in rs.Fields
strLine= strLine & x.value & chr(9)
if o>=m*n then
n=n+1
filename = Server.MapPath(“car/CarTable”&n&”.xls”) [...]
<%
‘ASP防注入之解决方案
‘特殊页面处理
‘因为有些页通过流式传递(比如含有文件上传的表单)
‘如果单一使用穷举Form对象的操作就会出错
‘所以要把这些页面过滤出来,同时在页面中使用sql(“检测的字串”)才行
‘垃圾猪zero@new57.com‘http://blog.csdn.net/cfaq
‘将本页用include方法放在头部以让所有页都可以调用,比如include在conn.asp里
‘如果有流式上传的页面请把该页加到表page中,以防form冲突
Dim N_no,N_noarray,req_Qs,req_F,N_i,N_dbstr,Conn,N_rs,N_userIP,N_thispage
N_userip = Request.ServerVariables(“REMOTE_ADDR”)
N_thispage = LCase(Request.ServerVariables(“URL”))
N_no = “‘|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare” ‘可以自己修改怀疑是注入操作的字串
N_noarray = split(LCase(N_no),”|”)
Call DBopen()
Call N_check_Qs()
Call N_checkPage()
Call DBCLose()
‘检测当前页是否是特殊页是就调用 N_check_form()
sub N_checkPage()
set N_rs = server.CreateObject(“ADODB.RecordSet”)
N_rs.open “select * from page where spcpage like ‘%”&N_thispage&”%’”,conn,1,1
if (N_rs.eof AND N_rs.Bof) then
Call N_check_form()
end if
N_rs.Close()
set N_rs = nothing
end sub
‘检测给定字串
sub N_sql(agsql)
’这里是不记录数据库,如果要改请自己修改
N_check “CUS”,req_Qs,”OTHER”
end sub
‘检测Request.Form
sub N_check_form()
If Request.Form<>”” Then
For Each req_F In Request.Form
N_check req_F,Request.Form(req_F),”POST”
Next
end if
end sub
‘检测Request.QueryString
sub N_check_Qs()
If Request.QueryString<>”” Then
For Each [...]
sql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现目前大部分黑客入侵都是基于sql注入实现的
,哎,,谁让这个入门容易呢,好了,,不说废话了,,目前我开始说如果编写通用的sql防注入程式
一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或get请求中的参数信息中
非法字符即可,所以我们实现http 请求信息过滤就能判断是是否受到sql注入攻击。
iis传递给asp.dll的get 请求是是以字符串的形式,,当 传递给request.querystring数据后,,
asp解析器会分析request.querystring的信息,,然后根据”&”,分出各个数组内的数据
所以get的拦截如下
首先我们定义请求中不能包含如下字符
|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare
各个字符用”|”隔开,,然后我们判断的得到的request.querystring
具体代码如下
dim sql_injdata
sql_injdata = “|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare”
sql_inj = split(sql_injdata,”|”)
if request.querystring“” then
for each sql_get in request.querystring
for sql_data=0 to ubound(sql_inj)
if instr(request.querystring(sql_get),sql_inj(sql_data))>0 then
response.write “alert(天下电影联盟sql通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!);history.back(-1)”
response.end
end if
next
next
end if
这样我们就实现了get请求的注入的拦截,不过我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,,我们只需要再进一次循环判断即可。代码如下
if request.form“” then
for each sql_post in request.form
for sql_data=0 to ubound(sql_inj)
if instr(request.form(sql_post),sql_inj(sql_data))>0 then
response.write “alert(天下电影联盟sql通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnhttp://www.521movie.com );history.back(-1)”
response.end
end if
next
next
end if
好了大功告成,,我们已实现了get和post请求的信息拦截,,你只需要在conn.asp之类的打开数据库文件之前引用这个页面即可。放心的继续研发你的程式,,不用再考虑是否还会受到sql注入攻击。难道不是么?
SQL Server 2005 和 2008 有几个关于高可用性的选项,如日志传输、副本和数据库镜像。所有这些技术都能够作为维护一个备用服务器的手段,同时这个数据库可以在你原先的主数据库出问题时上线并作为新的主服务器。然而,你必须记住的是将备用服务器替换上线只是完成了一半的故障修复工作。
要保证你的应用正常工作,在数据库外部还有许多注意事项。这其中包括登录信息、数据库用户、调度任务、DTS 和 SSIS 包、可执行文件、系统数据库中的对象、同名数据库、链接服务器等等。
有时这些细小的依赖只有在你进行一个数据库故障恢复时才会发现,这样你又不得不花费大量时间进行调试和评估导致这个问题的根源。此外,你还必须让第二台服务器和应用尽可能快地上线以减少停机时间。因此,提前做设置是非常重要的。
当涉及到高可用性和SQL Server 的灾难恢复规划时,你应该谨记我本人所喜欢的一个拉丁谚语 ——Si vis pacem, para bellum,它的意思翻译过来就是“如果你想要得到和平,那就得先作好战争准备。”记住这一点后,让我们来看看一些可能会遇到的问题。我也将建议几个预先可以完成的任务,以确保数据库故障恢复过程快速有效地完成。
SQL Server 登录信息与数据库用户
你的故障恢复服务器应该备份所有的登录信息和数据库用户,包括密码。登录信息可以在任何时候创建,但是如果你使用日志传输或数据库镜像,你的数据库将处理恢复状态,这样你只有在它们重新上线后才能完成恢复过程。
使用 Windows 认证,可以很容易地将登录信息映射到数据库用户。然而,如果你使用的是 SQL 认证,那么你需要手动地在你从另一个服务器获得的数据库上重新建立登录信息与数据库用户的连接。因此,你在迁移数据库时会丢失登录信息和数据库用户之间的连接。
当你在第二台服务器上恢复数据库后,运行这些代码:
USE YourDatabaseName
EXEC sp_change_Users_Login ‘UPDATE_ONE’, YourDBUserName, YourLogin
保持登录信息同步的另一个方法是遵循 Microsoft Knowledge Base 上关于 在 SQL Server 实例之间传输登录信息和密码 的文章的步骤。这篇文章阐述了如何使用原始的 SID 脚本化登录信息。当在故障恢复数据库服务器上创建这些登录信息时,登录信息与数据库用户之间的连接会被保存,这样你就不必运行上面的脚本修复孤立的用户。
1. PHP可阅读随机字符串
此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。
/**************
*@length – length of random string (must be a multiple of 2)
**************/
function readable_random_string($length = 6){
$conso=array(“b”,”c”,”d”,”f”,”g”,”h”,”j”,”k”,”l”,
“m”,”n”,”p”,”r”,”s”,”t”,”v”,”w”,”x”,”y”,”z”);
$vocal=array(“a”,”e”,”i”,”o”,”u”);
$password=””;
srand ((double)microtime()*1000000);
$max = $length/2;
for($i=1; $i
ASP 本身并不是一种脚本语言,它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境,而在ASP中最常用的脚本语言就是VBScript了。虽然ASP的脚本语言很简单,但是要想让一个ASP程序能够最优化的运行也不是一件简单的事情。
现在国内的网络带宽很有限,网络十分拥挤,如何使得自己的ASP应用程序能够快速的运行就成为了每一个ASP程序员的梦想了。那就跟随我来一同加速你的ASP程序吧!
一. 有关操作数据库的优化方法
我们使用ASP最主要的用途就是对数据库进行操作了,如何更快速的完成这些动作呢?
1. 不要任意使用“Select * ……”
请尽量拾取你所需要的那些字段,比如,一个Table中有10个字段,但是你只会用到其中的一个字段(name),就要使用“select name from yourtable”,而不是用“select * from yourtable”。你或许会说,我是这么做的阿,但是,如果一个table中有50个字段,你需要用到其中的23个字段的时候,你会怎么做呢?为了节省打字以及查找对应字段名称的麻烦,你就不一定会老老实实的用“select name,sex,age… from yourtable”了吧!
实际证明,尽量拾取你所需要的那些字段来使用select语句将会是你的ASP程序至少加快5%左右。
2. 尽可能使用系统存储过程(针对MS SQL Server)
有的时候完成一个读取操作,使用SQL语句和存储过程同样可以完成,但是使用存储过程将会大大加快完成读取操作的速度,也就提高了你的ASP程序运行的速度。
3. 注意你的游标使用方法
如果你仅仅是对一个table进行读取操作,那么请你使用forward-only,read-only游标,因为这种游标读取数据库是最为快速的,尤其是你的读取数据量很大的情况下。
4. 不要打开无用的独立记录集
也许你在笑了,我会打开没有用的记录集吗?是的,你当然会,比如在生成一个树型记录集的时候,你不得不打开父记录集以及对应的子记录集,甚至还有孙记录集,其实你可以使用ADO提供的Data Shaping技术来替代打开多个独立的记录集,那样会加快程序的运行速度。(关于Data Shaping的用法可以参考ADO帮助)
5. 一定要记着关闭打开的记录集对象以及连接(Connection)对象
有些朋友总是奇怪为何自己的ASP程序刚开始的时候运行速度很快,可是多运行几遍就越来越慢了呢?甚至出现服务器死机的情况。发生这种情况,就很可能是你打开了太多的记录集对象以及连接(Connection)对象而最后却没有关闭他们引起的。使用如下方法进行关闭:
程序代码
YourRecordSet.close
Set YourRecordSet=Nothing
Set YourConnection=Nothing
6. 取得数据库数据的方法比较
你是如何得到记录集的数据的呢?是不是用YourRecordSet(字段编号),还是YourRecordSet(“字段名称”)?其实还有其他的使用方法,现在我们就比较一下吧(100条记录):
程序代码
Rs(“字段名称”)
Rs(“字段名”).Value
Rs(“字段编号”)
Set方法
数据库回应时间
2.967秒
2.936秒
1.650秒
0.586秒
2.824秒
2.914秒
1.611秒
0.602秒
2.893秒
2.943秒
1.613秒
0.594秒
平均回应时间
2.895秒
2.931秒
1.625秒
0.594秒
这下知道了吧,前三种方法大家都可以看的明白,我就说说第四种方法(Set方法)如何使用:
程序代码
Dim strSQL
StrSQL=”select name,sex,age from yourtable”
Dim rs
Set rs=server.createobject(“ADODB.RECORDSET”)
Rs.open strSQL,conn,1,1
Const fieldsOrder=2
Dim objOrder
Set objOrder=rs(fieldsOrder)
Response.write objOrder ’Set方法
二. 有关ASP内置对象使用方面的优化方法
1. 尽量减少Session对象和Application对象的使用
虽然ASP中提供的这两个对象对我们的编程提供了很大的帮助,但是,对这两个对象要合理的使用,不要滥用。因为大量的使用这两个对象将会极大的增大服务器的负担,严重消耗系统资源。也将使你的ASP程序运行慢如老牛。
2. 要及时的关闭不再使用的对象(尤其是Session和Application)
不及时的关闭你所使用的对象会导致系统运行速度变得缓慢。也许你会问,Session和Application不是可以自动消失的吗?完全正确,系统默认30分钟内用户如果没有任何操作就自动触发Session_OnEnd和Application_OnEnd事件,但是大量的用户频繁的读取服务器,服务器将在很长的一段时间保持那些已经没有用的Session,Application对象,如果不及时关闭使用完的Session和Application后果将不堪想象了。
关闭的方法是:
Set 对象=Nothing
三. 合理使用Include文件
我们这里说的是指用<!–#include file=”xxx”–>形式包含进来的文件,并且文件内容全是ASP程序,也就是说你将一些公共的函数放到一个文件中,并在其他有可能调用其中函数的页面包含进来。
建议你不要将所有的函数放到一个包含文件中,因为你在其他页面包含这个文件的时候,服务器端是要进行预编译的,很可能在一个包含文件里面有上百个函数,而你只是想要使用其中的一个函数,这样就得不偿失了。所以,尽可能的分割你的包含文件成为多个小的包含文件。这样也可以提高程序的运行速度哦。
四. 有关VBScript语言方面的优化方法
1.尽量使用系统函数代替自己编写的函数
比如要想分割一个有规律的字符串(”sss,ddd,fff,ggg”),就不必自己使用什么Mid(),Instr等等函数来分析了,其实VBScript就提供了一个函数 Split(),这样既省时间,又提高了速度,何乐而不为呢?
2.减少动态数组的使用
3.尽可能的养成提前声明变量的习惯
不要小看了这一条,提前声明变量会加快程序的解释执行时间。相反,从不声明变量,不但程序难以阅读,整个程序在服务器的执行效率也会大打折扣的。
五. 其他方面的优化方法
1. 在ASP文件中尽量使用<%%>嵌入到HTML标签中,而不要使用Response.write的方式,比如:
程序代码
<html>
<body>
<%If ok =1 then %>
Hello! World!
<%End If%>
</body>
</html>
就远远比:
程序代码
<%
Response.write ”<html>”
Response.write ” <body>”
If ok =1 then
Response.write ”Hello! World!”
End If
Response.write ” </body>”
Response.write ”</html>”
%>
的运行速度要快,尤其是你的ASP文件比较大的情况下。因为,第二种方式增加了服务器端的解释时间,因而也就降低了ASP程序的性能。
2. 尽量用一个ASP文件完成一个动作
很多人喜欢在一个ASP程序中同时完成诸如添加,删除,查找等等多个动作,不要认为这样是有效的利用了文件,相反,这样做的结果是使得应用程序的运行速度减慢很多。
应当将添加,删除,查找等分割成单个的独立的ASP文件来完成。这样使得文件不会过于庞大,降低服务器端解释执行的负担,并且阅读程序也很快捷。
好了,经过我们的全面优化,你的ASP应用程序是不是运行的更加稳定,更加快速了呢?
XP 有个最大的问题就是 IIS5.5 只支持一个站点,如果每次修改不同网站都要到 Internet 信息管理里面更改一下一下站点主目录无疑是太麻烦了。
IIsAdmin.NET 是一个专门可以在 XP 的 IIS 下面建立多个站点的小工具
提醒:这个小工具需要 .NET 2.0 运行环境。
汉化修改版:点击下载
作者:Loveyuki
截图:
SQL Server 2005 相对于 2000 的进步非常大,特别是有了免费的 SQL Server 2005 Express 版本以后,就可以免费使用了。但是 2005 有个比较麻烦的就是找不到跟 2000 一样的服务管理器了。停止运行服务显得有些麻烦,每次都要进配置管理器进行操作,很不方便。
不过不怕,有了这个小工具以后你就可以拥有跟 2000 一样的服务管理器了。启动和停止 SQL Server 服务方便很多。提醒:本程序需要 .NET 2.0 运行环境。
点击下载
前两天我们介绍了一种新的存储无限级分类方法,但是读出分类的时候怎么实现树形显示呢?方法很简单,我们自己定义一个树形的数据结构,然后根据数据库存储的节点的深度来插入到树里面,当然显示的时候需要用递归来显示一下,不过这里的递归只是在内存里面递归,效率是相当高的。
2008-11-17 更新为不使用树结构,使用排序和深度来做文章。
在数据库读出数据的时候直接按照 LID 来进行 ASC
排序就可以了,默认的排列顺序就是按照树走的,大家可以插入一些数据,并读取一下就可以很明了的看到顺序了,插入树循环的时候只需要对深度进行运算就可以了。
下面我只写出了一些关键地方的代码,具体的代码自己试着多写写在纸上多画画应该就明白了。
另外就是想说下,这种分类算法只适用于一般的树形分类,并不适用于插入数据比较频繁的树形结构,比如说无限次回复的评论,无限次回复的评论有另外一种更适合的算法。
新的方法:
Response.Write(”
“);
Response.Write(”
由于数据库存储的数据都是以平面方式存储,所以目前大部分论坛和其他程序都是用递归来展现层次数据的,如果分类的层次十分深的话那么使用的递归次数相当可观,对性能的影响也非常大。最近要做一个分类信息的平台就遇到这个问题了,那么如何实现快速的展现分层数据呢?MYSQL 的开发者帮我们想到了一个算法,这个算法目前唯一的问题就是尚未实现分类排序,我们可以通过右值的反向排序实现先入先出的排序。在这里我们需要了解的是如何用 SQL Server 来实现,我们就以省市县数据库为例来实现:
如图所示我们将一个树节点的左右各编上号码,就可以看出一些规律,山西的左右值为(8,17),那么所有左值大于8,右值小于17的节点都是属于山西的子节点。稷山先的左右值为(14,15),那么他的所有父节点就是左值小于14,右值大于15的节点,怎么样,用这个方法实现的无限级分类性能绝对是顶呱呱的。一次查询就可以查出属于某个节点的数据以及他子节点的数据。这个算是我见过性能最高的无限级分类算法。其他算法跟这个对比基本没有任何优势。
我们先建立一个数据表,结构如下图(LID 为左值,RID 为右值,Tree 为节点深度,Name 和 ID 就不多说了,节点的索引和名称)
我们可以使用下面的存储过程来获得一个节点和其子节点:
CREATE PROCEDURE CLSP_ZoneSelect
(
@Root INT,
@Tree INT
)
AS
SELECT Z.ID,Z.Tree,Z.Name
FROM CL_ZoneData AS Z,CL_ZoneData AS P
WHERE P.ID = @Root
AND Z.LID >= P.LID AND Z.RID <= P.RID
AND (@Tree = 0 OR Z.Tree <= P.Tree + @Tree)
ORDER BY Z.LID ASC
GO
我们可以用下面这个存储过程来在一个节点下插入新的子节点:
CREATE PROCEDURE CLSP_ZoneInsert
(
@Root INT,
@Name NVARCHAR(50)
)
AS
DECLARE @RID AS INT,@NID AS INT,@Tree AS INT
SET @RID = 1
SET @NID = 0
SET @Tree = 1
IF @Root = 0
BEGIN
SELECT TOP 1 @RID = RID + 1
FROM CL_CateData ORDER BY RID DESC
END
ELSE
BEGIN
SELECT @RID = RID, @Tree = Tree + 1
FROM CL_ZoneData WHERE ID = @Root
END
IF @Root = 0 OR @RID > 1
BEGIN
UPDATE CL_ZoneData SET RID = RID + 2 WHERE RID >= @RID
UPDATE CL_ZoneData SET LID = LID + 2 WHERE LID > @RID
INSERT INTO CL_ZoneData(LID,RID,Tree,Name)
VALUES (@RID,@RID + 1,@Tree,@Name)
SET @NID = SCOPE_IDENTITY()
END
SELECT @NID
GO
删除一个节点可以用下面的存储过程:
CREATE PROCEDURE CLSP_ZoneDelete
(
@ID INT
)
AS
DECLARE @LID AS INT, @RID AS INT, @WID AS INT, @DID AS INT
SET @DID = 0
SELECT @DID = ID, @LID = LID, @RID = RID, @WID = RID - LID + 1 FROM CL_ZoneData WHERE ID = @ID
IF @DID != 0
BEGIN
DELETE FROM CL_ZoneData WHERE LID BETWEEN @LID AND @RID
UPDATE CL_ZoneData SET RID = RID - @WID WHERE RID > @RID
UPDATE CL_ZoneData SET LID = LID - @WID WHERE LID > @RID
END
SELECT @DID
GO
SQLite 是一个轻量级的数据库引擎,相比一般我们用 JET 引擎访问 Aceess 优点很多,ASP.NET 可以使用 System.Data.SQLite 这个 .NET Wrapper,我在本机测试了一下 Bitrac 程序使用不同引擎的速度,目前数据量很小的情况下可以提高一倍的速度,数据库越大提高肯定越多的。就是不知道 System.Data.SQLite 能否在这个服务器上使用,毕竟我所使用的服务器的 .NET 权限是有所限制的。
今天把 Access 到 SQLite 的转换程序已经写完了。明天测试一下服务器是否支持,不管支持不支持,Bitrac 都会多一个 Database Provider。写 Database Provider 真麻烦。每种数据库的 SQL 语句都不太一样,数据类型也要考虑好,真头疼。
现有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”)http://www.cnbruce.com/test/getrows/show2.asp以上两种均不能彻底解决执行时间漫长的问题,主要原因即是循环每次都须向数据库抽取记录(Command速度相对较快)
cmd.ActiveConnection = conn
cmd.CommandText = “Select * from people order by id desc”
Set rs = cmd.Execute
Do While Not rs.EOF
Response.write [...]