asp学习
我们来看看一个简单留言本的构成:
----------------------------------
1。ACCESS2000数据库bookdata.mdb,放置在data目录下
----------------------------------
有2个表:一个是admin,用于放置管理员信息,字段有id(自动计数),username(文本),adminpsw(文本);一个是info,用于放置留言,字段有id(自动计数),name(文本),from(文本),email(文本),neirong(备注),uptime(默认值为now())。
!是不是发现在ACCESS里改动数据后数据库会变的很大?即使删除数据?这里有个简单的方法,新建一个数据库,把原来的数据库全部导入,你就会看到数据库缩小了不少^^,然后覆盖回去吧
----------------------------------
2。数据库连接文件conn.asp
----------------------------------
<%连接数据库有多种方法,下面的采用较老版本ACCESS驱动的连接方法
set conn=server.createobject("adodb.connection")
DBPath = Server.MapPath("data/bookdata.mdb") 这里可以将mdb文件改名
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
%>
----------------------------------
3。留言本首页index.asp
----------------------------------
<%@LANGUAGE="VBSCRIPT"%>
<!--#include file="conn.asp"--><!--包含连接文件-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>ASP+ACCESS简单留言本</title>
<style type="text/css">
<!--
A:link,A:active,A:visited{TEXT-DECORATION:none ;Color:blue}
A:hover{TEXT-DECORATION:none;Color:red}
BODY,table,td{FONT-SIZE: 12px;COLOR: #000000;FONT-FAMILY:宋体;}
-->
}
</style>
</head>
<body><div align="center">
<table cellspacing=0 cellpadding=0 width=600 border=0>
<tr>
<td><center><font size=3 color=blue>欢迎来到我的留言本,多多指教</font></center></td>
</tr>
</table>
<table width="600" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="right">‖<a href="add.asp">我要留言</a>‖<a href="login.asp">管理进入</a>‖</td>
</tr>
</table>
<%
最典型的ADO应用
set rs=server.CreateObject("adodb.recordset")
建立数据查询,以时间先后排序(近的在最上面)
strSQL = "SELECT * FROM info ORDER BY uptime DESC"
rs.Open strSQL,conn,1,1
如果有记录则循环显示所有数据
Do While Not rs.EOF
%>
<hr width="600" size="1" noshade height=1>
<table width=600 border="0" cellpadding="2" cellspacing="0">
<tr><td>来自 <% = rs("from") %> 的 <a href="mailto:<% = rs("email") %>"><% = rs("name") %></a> 于<% = rs("uptime") %> 写下了
<% = rs("neirong") %>
</td></tr>
</table>
<%
rs.MoveNext
loop
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
</div></body></html>
----------------------------------
4。留言增加页add.asp
----------------------------------
<%@LANGUAGE="VBSCRIPT"%>
<!--#include file="conn.asp"-->
<%
如果能从浏览器客户端得到add的值,则执行添加数据
dim cadd
cadd= request("action")
if cadd= "add" then
dim cname,cfrom,cemail,cneirong
Trim()函数的作用是将取得的数据前后空格去掉,如果有的话
cname=Trim(Request.form("name"))
cfrom=Trim(Request.form("from"))
cemail=Trim(Request.form("email"))
cneirong=Trim(Request.form("neirong"))
Set rs = Server.CreateObject("ADODB.Recordset")
注意下面的 1,2 这个是Recordset对象的LockType属性,当为1,2时才允许更新数据
1,1 为只读(默认) 详情请查询相关资料
rs.Open "info",conn,1,2
rs.addnew
rs("name")=cname
rs("from")=cfrom
rs("email")=cemail
rs("neirong")=cneirong
rs("uptime")=now()
rs.update
rs.close
set rs=nothing
response.redirect "index.asp"
end if
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>填写留言</title>
<style type="text/css">
<!--
A:link,A:active,A:visited{TEXT-DECORATION:none ;Color:blue}
A:hover{TEXT-DECORATION:none;Color:red}
BODY,table,td{FONT-SIZE: 12px;COLOR: #000000;FONT-FAMILY:宋体;}
-->
}
</style>
<script>
function check(){
var name = document.addform.name.value;
var neirong= document.addform.neirong.value;
if (name=="" || neirong==""){
<%使用Recordset读取数据
创建一个Recordset对象实列
set myRecordset=Server.CreateObject("ADODB.Recordset")
定义用于创建Recordset的SQL语句
SQL="select * from student"
打开Recordset对象,传递SQL语句和其他参数
myRecordset.open SQL, "DSN=StudentWD=magic;UID=Student"
移动所返回的Recordset对象中的记录,并把记录输出到HTML表中
%>
<table border=1>
<tr>
<%
for I=0 to myRecordset.fields.count-1
%>
<td><b><%=myRecordset(I).name%></b></td><%next%></tr>
<%
do while not myRecordset.BOF
%>
<tr><%
for j=0 to myRecordset.count-1
%>
<td aligh=top><%=myRecordset(I)%></td>
<% next %>
</tr>
<%
myRecordset.movenext
loop%>
</table>
<%@LANGUAGE="VBSCRIPT"%>
<!--#include virtual="/adovbs.inc"-->
<!--如果你使用了ADO常量,这个文件必须包含-->
<%
dim cadd
cadd= request("action")
if cadd= "add" then
on error resume next
用Trim()函数去掉提交数据开头和结尾的空格,如果有的话
cname=Trim(Request.form("name"))
cyear=Trim(Request.form("year"))
cid=Trim(Request.form("id"))
conn="DSN=student;uid=student;pwd=magic"
set rs=server createobject("adodb.Recordset")
rs.open "authors",conn,adoenstatic,adlockoptimistic
rs.addnew
rs("au_id")=cid
rs("name")=cname
rs("year")=int(cyear)
rs.update
rs.close
set rs=nothing
on error的使用方法
if err.number>0 then
response.write "vbscript errors occured:"&"
"
response.write "error number="&err.number&"
"
response.write "error descr="&err.description&"
"
response.write "help context="&err.helpcontext&"
"
response.write "help path="&err.helppath&"
"
response.write "native error="&err.nativeerror&"
"
response.write "source="&err.sourcr&"
"
else
response.write "record was added fine!
"
end if
end if
%>
<html>
<head>
<title>用Recordset向数据库中增加数据</title>
<body bgcolor="#ffffff">
<!--下面的表单用于客户端输入数据-->
<form name="myauthor" action="addnew.asp?action=add",method="post">
author id: <input type="text" name="id"></p>
author name: <input type="text" name="name"></p>
year born: <input type="text" name="year"></p>
<input type="submit"></p>
</form></body></html>
我们可以很容易的利用SQL语句从数据库中刷取出我们想要的数据,如:
sql="select * from info order by time desc"
这条语句就是说从info表中按time字段的值排列取出所有数据,我们怎样取出前10条呢?我在开始学习SQL的时候不知道用什么可以做到,只好用一个小循环来实现,其实非常简单,这样就可以拉:
sql="select top 10 * from info order by time desc"
但是我们一定要取出所有数据怎么办呢?如果取出的数据比想象中的多怎么办呢?难道在一页里全部显示?所以我们就要用到ASP数据库应用中很重要的一个方面:分页显示。
(等有时间再添 或哪位兄弟帮个小忙,写详细点,拜托 )
(啊哈,今天心情不错,继续^^)
------------------------------------------------------------------------------------
第一种方法:
通过Recordset的GetRows方法(关于Recordset的更多信息可以参考ASP的帮助文件?有吗?晕S,到网上搜索一下可以有一大堆),可以实现数据记录的分页显示。比如下面的这个列子:
<%@ Language = VBs cript %>
<% Option Explicit %>
<%
Dim iStart, iOffset
iStart = Request("Start")
iOffset = Request("Offset")
if Not IsNumeric(iStart) or Len(iStart) = 0 then
iStart = 0
else
iStart = CInt(iStart)
end if
if Not IsNumeric(iOffset) or Len(iOffset) = 0 then
iOffset = 10
else
iOffset = Cint(iOffset)
end if
Response.Write "察看 " & iOffset & " 个记录从 " & iStart & "开始
"
Dim objConn, objRS
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "rovider=SQLOLEDB.1;Data Source=(local);uid=sa;pwd=;Initial Catalog=pubs"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT * FROM Authors", objConn
Dim aResults
aResults = objRS.GetRows
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
Dim iRows, iCols, iRowLoop, iColLoop, iStop
iRows = UBound(aResults, 2)
iCols = UBound(aResults, 1)
If iRows > (iOffset + iStart) Then
iStop = iOffset + iStart - 1
Else
iStop = iRows
End If
For iRowLoop = iStart to iStop
For iColLoop = 0 to iCols
Response.Write aResults(iColLoop, iRowLoop) & " "
Next
Response.Write "
"
Next
Response.Write "
"
if iStart > 0 then
显示“前 10个”连接
Response.Write "<A HREF=""paging.asp?Start=" & iStart-iOffset & _
"&Offset=" & iOffset & """>前 " & iOffset & "</A>"
end if
if iStop < iRows then
显示“后 10个”连接
Response.Write " <A HREF=""paging.asp?Start=" & iStart+iOffset & _
"&Offset=" & iOffset & """>后 " & iOffset & "</A>"
end if
%>
(大家还可以看到更多的使用Recordset方法的列子)
第二种方法:
这个也不能说是第二种了,因为它不适合ACCESS,通过 MS SQL的存储过程。
假设我们要对数据表MyTable的数据实现分页显示,首先写一个存储过程如下:
CREATE PROCEDURE sp_PagedItems
(
@Page int,
@RecsPerPage int
)
AS
-- 加快表的 插入速度
SET NOCOUNT ON
-- 开始记录 号
DECLARE @RecCount int
SELECT @RecCount = @RecsPerPage * @Page + 1
--创建临时 表
CREATE TABLE #TempItems
(
ID int IDENTITY,
Name varchar(50),
Price currency
)
-- 准备临时 表
INSERT INTO #TempItems (Name, Price)
SELECT Name,Price FROM MyTable ORDER BY Price
-- 求出要查 询的最小ID和最大ID
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@Page - 1) * @RecsPerPage
SELECT @LastRec = (@Page * @RecsPerPage + 1)
-- 得到实际 的记录,并返回是否还有数据!
SELECT *,
MoreRecords =
(
SELECT COUNT(*)
FROM #TempItems TI
WHERE TI.ID >= @LastRec
)
FROM #TempItems
WHERE ID > @FirstRec AND ID < @LastRec
-- 恢复设置
SET NOCOUNT OFF
在这个存储过程里,我们首先创建一个全部记录的临时表,并增加了一个自动编号的字段ID。这样,不同的记录就有一个递增的唯一标志。
根据当前的页号和每页的记录数,可以计算出每页的最小和最大的ID。从而得到当前页的所有记录。
为了显示的方便,存储过程还计算了 MoreRecords字段,作为显示下一页的判断条件。
利用了这个存储过程的程序代码如下:
<%
每页显示10条
Const iRecordsPerPage = 10
Dim currentPage 当前页号
Dim bolLastPage 在最后一页?
if len(Request.QueryString("page")) = 0 then
currentPage = 1
else
currentPage = CInt(Request.QueryString("page"))
end if
得到当前页的记录
strSQL = "sp_PagedItems " & currentPage & "," & iRecordsPerPage
objRS.Open strSQL, objConn
判断是否在最后一页
if Not objRS.EOF then
if CInt(objRS("MoreRecords")) > 0 then
bolLastPage = False
else
bolLastPage = True
end if
end if
%>
<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 ALIGN=CENTER>
<TR><TH COLSPAN=2 BGCOLOR=NAVY>
<FONT SIZE=+1 COLOR=WHITE>
List of Items
</FONT>
</TH></TR>
<%
Do While Not objRS.EOF %>
<TR><TD ALIGN=LEFT BGCOLOR=GRAY>
<%=objRS("Name")%>
</TD><TD ALIGN=CENTER BGCOLOR=GRAY>
<%=FormatCurrency(objRS("rice"))%>
</TD></TR>
<% objRS.MoveNext
Loop %>
</TABLE>
<CENTER>
<%
第一页不 显示“前一页”
if currentPage > 1 then %>
<INPUT TYPE=BUTTON VALUE="<< 前 <%=iMaxRecords%> 记录 "
ONCLICK="document.location.href=thispage.asp?page=<%=currentPage-1%>"> ;
<% end if
最后一页 不显示“后一页”
if Not bolLastPage then %>
<INPUT TYPE=BUTTON VALUE="后 <%=iMaxRecords%> 记录 >>"
ONCLICK="document.location.href=thispage.asp?page=<%=currentPage+1%>"> ;
<% end if %>
</CENTER>
更多阅读
photoshop学习教程
photoshop学习教程——简介photoshop是一款强大的图片处理软件,用它强大的功能,可以使我们达成很多目的。今天我就来教大家用ps去水印的方法。photoshop学习教程——工具/原料?psphotoshop学习教程——方法/步骤photoshop学习教程 1
四快学习法的价格问题
四快学习法的价格问题——简介随着现在的四快学习法的逐渐在我国的各个区域市场的畅销,很多的学生家长都开始积极地关注到这样的热门的教辅材料,因为很多人都想要了解到四快学习法的神奇之处,想要知道为什么简单的教辅方法就能够改
五笔打字学习教程:1 初学五笔的疑问解答
五笔打字学习教程:[1]初学五笔的疑问解答——简介一步一步地教会你使用五笔输入法打字,最终成为打字高手。请看我的系列经验。五笔打字学习教程:[1]初学五笔的疑问解答——工具/原料五笔输入法五笔打字学习教程:[1]初学五笔的疑问解答
洛克王国,怎样学习百变液化术?
洛克王国的百变液化术要怎么学习呢?洛克王国,怎样学习百变液化术?——学习方法洛克王国,怎样学习百变液化术? 1、点开任务档案-成长之路-魔法之路-液化术课程选择现在就过去! 洛克王国,怎样学习百变液化术? 2、来到实验工坊点击爱因斯坦对
关于儿童学习跆拳道的几个问题
关于儿童学习跆拳道的几个问题——简介练习跆拳道能提高吃苦耐劳的能力.无论练习哪种武术,都是要下苦功夫的,一个动作为了做的标准,有力量、有速度,可能要练习成百上千次,没有吃苦耐劳的精神是做不到的.强身健体.跆拳道也是一项体育竞技,