没有数据库就没有ASP 。可以说,ASP 其实就是在HTML中插入数据库操作代码,再将文件保存为xx.asp而已,因此,学习ASP的重点在数据库的操作,而ASP的语法和其它语言的语法基本上是差不多的,只要懂得QB就已经能够对付。数据库的基本操作有:
数据库连接 数据读取 数据添加 数据修改 数据删除 分页显示 SQL查询示例
|
一,数据库的连接
要点: 数据库操作只能通过“对象”来进行。 连接对象 Connection,操作对象 Recordset
|
<% |
ASP代码起始标记。
|
DIM conn,Rs |
定义变量,也可不定义,提倡定义以保持良好风格。
|
Set conn = Server.CreateObject("ADODB.Connection") |
创建数据库连接对象 Connection。
|
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\XX\XX\user.mdb") |
打开数据库连接。以上代码普遍有效,只须更改数据库路径和名称。(还有一种方式效果相同)
|
|
Set Rs=server.CreateObject("adodb.recordset") |
创建数据库操作对象 recordset。
|
Function CloseDB Rs.close Conn.Close Set Rs=nothing Set Conn=Nothing End Function |
定义关闭函数,顺序不可颠倒。在操作结束时及时用 Call CloseDB 调用执行以关闭数据库,节约资源。 |
%> |
ASP代码结束标记 |
附加说明: 1,另一种打开数据库连接的形式为: conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\XX\XX\user.mdb") 2,上述代码后两句,也可在具体应用临时时书写,不放在这里。 3,将代码单独保存为 conn.asp 文件。以后,在凡涉及数据库操作的程序开头,都用<!--#include file=conn.asp-->将其包含进来,就可执行相关操作了。这是任何数据库操作程序必须的第一步。
TOP |
二,数据库的读取
要点: SQL 查询语句;向浏览器返回信息 Response.write("xxxx")
|
<!--#include file=conn.asp--> |
引进conn对数据库的连接,数据库操作的必须步骤,除非重新照写一遍。 |
<% |
ASP代码起始标记。 |
SQL="select * from table order by id asc" |
SQL 的查询语句,根据需要设定。基本语法如下:Select 字段名(多个字段用逗号间开,全部字段则用通配符“*”) From 表名(多个表用逗号间开) 条件(本句为 id 升序,desc 是降序) |
Rs.open sql,conn,1,1 |
打开数据库查询的方式:仅读取用 1,1,增加用 1,2,删除、修改用 2,3(也可读取外都用 1,3) |
Rs.movefirst |
将指针移到第一条记录。本例 SQL 中已设置条件,可以不用。实际上数据库一打开指针总是指向第一条记录的。 |
If rs.eof and rs.bof then Response.write“没有可以显示的数据” |
如果数据指针同时指到记录集的头部和尾部,说明这时候记录集为空 |
while not rs.eof |
判断指针是否到末尾,没有循环读取。 |
response.write(rs("name")) |
显示数据表table中的name字段 |
rs.movenext |
将指针移动到下一条记录,相当于其他语言的 NEXT |
wend |
循环结束 |
Call CloseDB |
调用关闭函数,关闭数据库 |
%> |
ASP代码结束标记
TOP |
三,数据库的添加
要点: 改变(增加、修改、删除)数据库为使操作直观,最好应用表单( 设定好表单传递的变量 action=" style=xxx",据此执行相应的操作); 添加数据函数 Rs.addnew, 更新数据库函数 Rs.update 读出数据:Rs("xxx") 写入数据:Rs("xxx")=Requset("xxx")----将表单项的值写入数据库相应字段。 改变数据库,应该设置权限,以保证安全。一般都用 Session 对象,如登陆成功后 Session("PROADMIN")=True,修改完成后将其中的值释放。
|
<!--#include file=conn.asp--> |
引进conn对数据库的连接。 |
<% |
ASP代码起始标记。 |
SQL="select * from table" |
SQL 的查询语句: Select 字段名(全部用 * 号代替) From 表名 |
Rs.open sql,conn,1,3 |
打开数据库查询的方式:增加、删除、修改用 1,3 |
Rs.addnew |
新增加一条记录 |
Rs("xxx1")=request("xxx1") Rs("xxx2")=Request("xxx2") Rs("......")=Request("......") |
将数据写入相应字段 |
Rs.update |
更新数据库 |
Response.Write("<script language=javascript> alert(""添加数据成功"");window.location.replace('add.asp');</script>") |
弹出添加成功信息框 |
Response.End() |
关闭数据库,用了这句就不再用下句,作用相同。 |
Call CloseDB |
调用关闭函数,关闭数据库 |
%> |
ASP代码结束标记 |
附加说明: 1,也可设定 Sql="select * from table where (id is null)" 2,也可将一个特定的值写入相应的字段:Rs("xxx")="xx" 3,另一种不须 SQL 语句的“插入”方式的写入,字面比较复杂,形式为: conn.execute("insert into table (xxx1,xxx2,xxx3) values ('"&Request.Form("xxx1")&"','"&Request.Form("xxx2")&"','"&Request.Form("xxx3")&"')")
TOP |
四,数据库的修改
要点: 修改和增加原理相同,不同点在于重写指定 ID 号的记录(去掉 addnew 语句)。 关键是要选准修改的依据(字段=值,本例以 ID 为依据)。 修改的既可以是一个字段,也可以是全部。 修改和删除通常使用记录的 ID, 从何而来?来自隐藏表单 <input name="id" type="hidden" value="<%=rs("ID")%>">,值是不需要修改的,作用是传递变量;如果是在其他页面完成操作,则用 <A href="edit_r_gBook.asp id=<%=rs(" id")%>"> 的形式传递变量 ID。余类推。
|
<!--#include file=conn.asp--> |
引进conn对数据库的连接。 |
<% |
ASP代码起始标记。 |
id=cint(request("id")) xxx1=request("xxx1") xxx2=request("xxx2") ......=request("......") |
将表单中的新值先存入变量 |
sql="select * from table where ID="&id |
SQL 查询语句,指定找到 ID=id 那个记录。 |
Rs.open sql,conn,1,3 |
打开数据库查询的方式:修改用 1,3 |
Rs("xxx1")=request("xxx1") Rs("xxx2")=Request("xxx2") Rs("......")=Request("......") |
将数据写入相应字段 |
Rs.update |
更新数据库 |
Response.Write("<script language=javascript> alert(""修改数据成功"");window.location.replace('add.asp');</script>") |
弹出修改成功信息框 |
Response.End() |
关闭数据库,用了这句就不再用下句,作用相同。 |
Call CloseDB |
调用关闭函数,关闭数据库 |
%> |
ASP代码结束标记 |
附加说明: 也可用以下形式修改: ID=id xxx="xx" sql="update data set xxx='"&xx&"' where ID="&CInt(ID) conn.Execute(sql) 或用下面删除的更直接的形式。
TOP |
五,数据库的删除
要点: 删除是删除一个记录,而不是记录中的某一字段; 关键是要选准删除的依据(字段=值),防止误删。 SQL 语句中,select 改为 delete。
|
<!--#include file=conn.asp--> |
引进conn对数据库的连接。 |
<% |
ASP代码起始标记。 |
id=request("id") |
确定删除哪个记录 |
SQL="delete * from table where ID="&id&"" |
SQL 查询语句,注意 delete 和 where ID="&id&" 的用法。 |
Rs.open sql,conn,1,3 |
打开数据库查询的方式 |
Response.Write("<script language=javascript> alert(""删除数据成功"");window.location.replace('add.asp');</script>") |
弹出删除成功信息框 |
Response.End() |
关闭数据库,用了这句就不再用下句,作用相同。 |
Call CloseDB |
调用关闭函数,关闭数据库 |
%> |
ASP代码结束标记 |
附加说明: 另外的删除方式: 1,按部就班进行,好理解,删除多个符合条件的记录 xxx="xx" sql="select * from table" rs.open SQL,conn,1,3 while not rs.eof if rs.("xxx")=xxx then rs.delete rs.update else rs.movenext emd if wend Call CloseDB 2,不要 SQL 语句,和打开语句 就一句 conn.execute("delete * from table where ID="&id&"") 即可。
TOP |
六,数据的分页显示
提示: 分页显示是数据库操作的难点,方法很多,但当数据和同时在线人数都不是很多的时侯,通常采用将数据库中所有符合查询条件的记录一次性的都读入 Recordset ,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性来进行分页处理,实际上是对 Recordset 进行操作: BOF 属性:目前指标指到 RecordSet 的第一笔; EOF 属性:目前指标指到 RecordSet 的最后一笔; Move 方法:移动指标到 RecordSet 中的某一条记录; AbsolutePage 属性:设定当前记录的位置是位于哪一页( 绝对页 ); AbsolutePosition 属性:目前指标在 RecordSet 中的位置; PageCount 属性:显示 Recordset 对象包括多少"页"的数据( 页数目 ); PageSize 属性:显示 Recordset 对象每一页显示的记录数( 页大小 ); RecordCount 属性:显示 Recordset 对象记录的总数。
下面示例更改库名、文件名普遍有效。
|
<!--#include file=conn.asp--> |
引进conn对数据库的连接。 |
<% |
ASP代码起始标记。 |
SQL="select * from table order by id desc" |
SQL 的查询语句,根据需要设定。desc 是降序) |
Rs.open sql,conn,1,1 |
打开数据库查询的方式。 |
Rs.movefirst |
将指针移到第一条记录。 |
Rs.pagesize=MaxPerPage |
设定每页显示多少条记录。(具体数目在此前定义或从库中读取) |
If trim(Request("Page"))<>"" then CurrentPage= CLng(request("Page")) If CurrentPage> rs.PageCount then CurrentPage = rs.PageCount End If Else CurrentPage= 1 End If |
设定当前页。 |
|
IF Rs.bof and Rs.eof then Response.write "<p align='center'>数据库中没有记录!</p>" else |
正式开始显示。如果开始即是结束,为空的数据库。 |
totalPut=rs.recordcount if CurrentPage<>1 then if (currentPage-1)_ *MaxPerPage<totalPut then rs.move(currentPage-1)_ *MaxPerPage dim bookmark bookmark=rs.bookmark end if end if |
总的记录数。 |
if (totalPut mod MaxPerPage)=0 then n= totalPut \ MaxPerPage else n= totalPut \ MaxPerPage + 1 end if |
计算总的页数:n= totalPut \ MaxPerPage。注意,最后一页不管有多少条记录,都要算一页! |
%> |
ASP代码结束标记 |
<% i=0 do while not rs.eof %> <table width="600"_ border="1" ALIGN="CENTER"> <tr> <td><%=rs("id")%></td> <td><%=rs("name")%></td> <td><%=rs("riqi")%></td> </tr> <tr> <td COLSPAN="3"_ align="center"><%=rs("content")_ %></td> </tr> </table> <% '当显示记录大于maxperpage时结束这页 i=i+1 IF i>=MaxPerPage then exit do rs.movenext loop %> |
循环显示具体内容。基本是纯 HTML 代码,可以根据具体需要灵活设计显示页面。 |
<P ALIGN="CENTER">共有<%=rs.recordcount%>条纪录 共有<%=n%>页 此为第 <%=currentpage%>页 <%k=currentPage if k<>1 then response.write "[<b>"+"_ <a href='page2.asp page=1'>_ 首页</a></b>] " response.write "[<b>"+"_ <a href='page2.asp page="+_ cstr(k-1)+"'>上一页</a></b>] " else Response.Write "[首页]_ [上一页]" end if if k<>n then response.write "[<b>"+"_ <a href='page2.asp page="+_ cstr(k+1)+"'>下一页</a></b>] " response.write "[<b>"+"_ <a href='page2.asp page="+_ cstr(n)+"'>尾页</a></b>] " else Response.Write "[下一页]_ [尾页]" end if %> </P> <% END IF |
这一段代码显示数据库信息和显示页面的信息,可根据需要增减和布局。注意文件名,否则出错。 |
|
rs.close set rs=nothing %> |
关闭数据库 |
附加说明: 分页显示的方法很多,此是比较简单,容易理解的一种。经过反复测试,运行是正确的,用到别的地方,只需做很小改动。
TOP |
七,SQL 查询示例
提示: 下面是常见的 SQL 查询,根据基本原理,可衍生出丰富的实例。
|
查询实例: 1.select * from asset,class where asset.sum=class.class_id 2.select * from asset where name like '%电%' order by id desc 3.select * from asset where name='' 4.select * from asset where name<>'' 5.select * from asset where sum is not null 6.select * from asset where sum is null 'null不等于'' 7.select * from asset where dat>#2001-7-20# 8.select max(sum) as 最大值,min(sum) as 最小值,sum(sum) as 总和,avg(sum) as 平均值,count(sum) as 记录数,count(*) as 总记录数 from asset 9.select * from asset where name like '__' '找两个字符的记录 10.select * from asset where name like '%电%' and name like '%脑%'
增加,修改,删除实例: 1.insert into asset(name,sum,dat,pass) values('电器',24,#2001-8-8#,1) 2.update asset set pass=0 where pass=1 3.delete from asset where name='电视' and pass=true
创建,删除,增加字段实例: 1.CREATE TABLE test (数字 int NOT NULL,文本 text (250),日期 datetime,备注 memo,是否 bit,primary key(数字)) 2.DROP TABLE test '删除表 3.ALTER TABLE test ADD sum int,tt text (50) '增加字段sum和tt
|
后记: 数据库操作其实只有这么简单几种形式,关键在于 SQL 的设置以适应各种情况,以及执行 SQL 的不同形式而已。本学习小结结构不是很严密,但涵盖了包括显示分页在内的几乎全部内容,认真领会已够用矣。直接复制稍加改动亦可实际应用。
TOP
|