第08章 MFC编程基础.docx
《第08章 MFC编程基础.docx》由会员分享,可在线阅读,更多相关《第08章 MFC编程基础.docx(37页珍藏版)》请在冰豆网上搜索。
第08章MFC编程基础
第八章ASP数据访问
本章提要:
本章介绍数据访问的基本概念,并以Access数据库为例,详细介绍ASP的数据库连接,记录的写入、查询、删除、修改等操作,通过实例介绍如果在页面上进行记录的显示和分页等技术。
8.1表单数据传送
通过表单元素向服务器传送变量,然后将变量值显示在客户端的浏览器,是一项很平常而重要的工作。
8.1.1表单元素
表单元素就如VisualBasic之中的控件一样。
在Dreamweaver2004中,提供了这些元素的具体形式。
而表单域作为互动性的一种高级类型,它将表单元素结合在一起,让用户可以通过浏览器,将数据传送到服务器上的其他ASP应用程序。
所有的通用表单元素(如单选按钮、下拉列表、复选框等)都可以根据网站的整体构思添加到页面之上,以完成网页的制作。
下面的图8.1给出了Dreamweaver2004中的表单元素,它们包括文本字段、隐藏域、文本域、复选、单选、单选组、列表菜单、跳转菜单、图像域、文件域、按钮、标签、字段集等。
图8.1DreamweaverMX2004设计视图中的表单元素
也可以通过插入菜单,来插入这些表单元素。
图8.2给出了通过插入菜单插入表单元素的列表。
图8.2DreamweaverMX2004设计视图下插入菜单中的表单元素
8.1.2建立表单域
表单元素放在一个表单域里面,建立一个表单域,然后修改动作里面的文件为要接受这个表单变量的ASP文件。
方法有两种,一种是post,这个方法传送的变量不会在浏览器的地址栏里面显示,可以大批量传送数据;另一种是get,则是会在浏览器地址栏里面显示的。
下面我们通过一个文本表单元素来说明建立表单域的方法。
文本域是最基本的表单元素,它传送的是文本信息。
一般用户名、密码等都要用这个元素传送,只不过如果是密码的话,要在类型里面选择密码类型,这样就会以*代替显示出来的密码字符。
文本域的名字很重要,以后会用到这个名字所以一般不用默认的名字。
示例:
◆建立一个提交表单asp01f.asp文件。
图8.3为代码,图8.4为显示效果。
图8.3提交表单asp01f.asp
图8.4提交表单asp01f.asp的显示效果
这个表单开始的一行:
,指定了表单提交的模式为post方式以及向谁(asp01.asp)提交。
这个表单中有两个用于数据输入的文本框:
用户和密码。
注意密码框的type属性是password,那么在密码输入时,为安全起见,将不会显示其值,而用*号代替。
另有两个单选按钮,用于选择性别。
还有一个选项列表,用于选择城市。
最后两个按钮,一个用于确定提交,一个用于取消重置,请分别注意它们的type属性为submit和reset。
◆建立一个接收提交信息并显示的页面asp01.asp。
图8.5为代码。
图8.5接收并显示提交信息页面asp01.asp
由于前面是用的post方法,那么在asp01.asp里面,就可以用这样的语句来得到变量:
<%user=request.form("user")%>。
如果要显示变量则用:
<%response.writeuser%>。
而如果方法用的是get方法,那么就改为<%name=request.querystring("user")%>。
实际上,两者可以统一为name=request("name")。
◆运行。
下面是运行时的状态。
图8.6首先执行asp01f.asp,填入数据后,按确定提交,得到图8.7的显示结果。
图8.6执行提交表单并填入信息
图8.7接收显示结果
8.2数据库的建立
为了进行数据的访问,首先要建立数据库,本节以Access2003为例,建立一个名为exasp.mdb的数据库,并建立一个users数据表,以备本章示例之用。
有关其他类型的数据库,我们在后面将给出一个总结说明,而更多的数据库知识,请参阅相关资料。
下面通过图示,快速介绍建立的过程。
图8.8Access2003工作界面
图8.8Access2003新建文件面版
图8.9新建数据库取名exasp.mdb
图8.10exasp.mdb对象设计窗体
图8.11在exasp.mdb数据库新建表users
图8.12设置time字段默认值
图8.13输入几条初始数据库而得到的表
8.3数据库的连接与记录的读取
本节学习掌握ASP页面的Access数据库的连接,以及数据表记录的读取。
下面的步骤是一个典型的ASP与数据库连接的过程:
建立连接对象、设置数据库路径:
打开数据库、设置记录对象、取记录。
在ASP中,用来存取数据库的对象统称ADO(ActiveDataObjects),主要含有三种对象:
Connection:
数据连接对象,用于打开或连接数据库。
Recordset:
记录集对象,用于存取数据表记录。
Command:
命令对象,用于对数据库执行查询命令。
8.3.1数据库的连接
基于微软IIS的平台上,通过服务器端运行的ASP程序来访问后台数据库,是一种最常见的模式。
而对于小型的数据库应用需求,微软的Access数据库,应该是与ASP程序配套使用的首选。
由于Access数据库的ODBC驱动程序支持的SQL指令集,执行效率高,所以Access后台数据库、ASP服务器端程序、客户端IE浏览器,是一个精练实用高效的组合模式。
在这种使用模式中,ASP程序无疑是最重要的,是沟通客户端和后台数据库之间的桥梁。
在ASP程序中,通过VBScript,建立对Access数据库的连接,是客户能够访问后台数据库的前提。
连接各数据库可以使用驱动程序,也可以使用数据源,建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。
请看下面的代码:
<%
setconn=server.createobject("adodb.connection")
conn.open"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="&server.mappath("exasp.mdb")
%>
◆程序行:
setconn=server.createobject("adodb.connection"),利用Server对象的createobject方法,建立一个ADO对象集中的connection对象,即连接对象。
这是建立数据库连接的初始步骤。
执行这行程序后,conn成为一个连接对象。
◆程序行:
conn.open"Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&server.mappath("exasp.mdb"),利用连接对象conn的open方法打开一个指定的数据库。
其中,服务器对象的mappath函数,取得要打开数据库的完整的文件路径,这其中,数据库名是我们需要指定的参数,应该用我们要打开的数据库的实际名称替代。
如果数据库名是直接作为常量出现,要用引号将其括起来,并且不能丢掉扩展名。
简单地说,上面的代码就是两句话,第一句话定义了ADODB数据连接组件conn,第二句话利用连接组件conn连接到了数据库exasp.mdb。
再看下面的代码:
<%
exec="select*fromusers"
setrs=server.createobject("adodb.recordset")
rs.openexec,conn
%>
这三条语句加在前面两条语句的后面。
◆程序行:
exec="select*fromusers"。
设置查询数据库的命令,它是通过一个SQL查询语句实验的。
select后面加的是字段,*表示所有字段,from后面再加上表的名字,我们前面在exasp.mdb数据库中建立了一个users表。
◆程序行:
setrs=server.createobject("adodb.recordset")。
定义一个记录集组件。
今后,可以将通过执行查询所有搜索到的记录都放在这个组件(对象)中,
◆程序行:
rs.openexec,conn。
是打开这个记录集,exec就是前面定义的查询命令,conn就是前面定义的数据库连接组件。
这一句的含义可能简单理解为:
在conn所指定的数据库中去,依据exec的设定去执行查询,将查询结果放在打开的rs对象中。
关于这条语句的参数值说明如下:
格式:
Recordset.openSource,ActiveConnection,CursorType,LockType,Options
各参数的含义如下表8.1
参数
含义
值
参数值含义
Source
SQL查询、数据表或存储过程
ActiveConnection
打开的连接或连接字符串
CursorType
游标类型
0
只在记录中向前移动,速度较快。
1
可任意移动,其他用户修改记录可见,添加记录不可见,删除记录字段值不可用。
2
可任意移动,其他用户改、添、删的记录均可见,速度较慢。
3
可任意移动,其他用户增、删、改的记录均不可见。
LockType
并发控制
0
记录为只读
1
只要保持Recordset为打开,其他用户就无法编辑该记录集中的记录。
2
当更新recordset中的记录时,将记录加锁
3
以批模式时更新记录时加锁
Options
指定source传递命令的类型
1
SQL语句
2
数据表名
4
存储过程
8
未知类型
表8.1Recordset.open参数说明
8.3.2记录的读取
以下语句完成记录的读取:
<%dowhilenotrs.eof%>
<%=rs("ID")%>
<%=rs("name")%>
<%=rs("tel")%>
<%=rs("city")%>
<%=rs("time")%>
|
<%
rs.movenext
loop
%>
在一个表格中,我们用5列分别显示了上次建立的表里面的5个字段,用do循环,notrs.eof的意思是条件为没有读到记录集的最后,rs.movenext的意思是显示完一条转到下面一条记录,<%=%>等价于<%response.write%>用于在html代码里面插入asp代码,主要用于显示变量。
8.3.3示例
下面的图示给出了一个表、一个查询显示数据ASP页面及其执行结果。
注意:
通常我们将数据库连接语句作为单独的ASP文件(如conn.asp),而在具体的数据库操作页面中,通过一条语句包含这个文件即可:
--#includefile="conn.asp">。
图8.14已建立的数据库exasp.mdb中的表users
图8.15用于数据库连接的conn.asp
图8.16通过查询显示数据页面asp02.asp
图8.17asp02.asp的执行结果
8.4记录的写入
8.4.1记录写入
先建立一个表单(图8.18)
图8.18写入提交表单
再建立一个记录写入操作ASP页面(图8.19)。
其中包含了conn.asp文件,用以连接到数据库exasp.mdb。
通过request对象,得到提交表单中的值,将其赋给相应变量。
接着建立一个SQL查询字符串:
exec="insertintousers(name,tel,city)values('"&name&"',"&tel&",'"&city&"')"
insertinto后面加的是表的名字users,紧跟其后的括号里面是需要添加的字段名,不用添加的字段以及字段内容为默认值的,可以省略不写。
values后面是传送过来的变量。
以后执行查询时,将这些变量的值添加到记录的字段中。
请注意:
exec是一个字符串变量,它保存了一个SQL查询语句字符串,这个字符串是分为如下七节通过&操作符连接起来的。
"insertintoguestbook(name,tel,message)values('"
name"',"tel",'"city"')"
在ASP里面不能嵌双引号,可以用单引号代替双引号,放在双引号里面,连接两个变量用+或者&。
中间的name、tel、city,就是表单传来的变量。
对于name和city,将用单引号括起来,表示是字符串。
而tel是数字型变量,所以不需要单引号括起来。
如果用表单传来的数据代替变量名字,并假设name="张三",tel=8877666,ciyt="广州。
则上述查询字符串的实际结果为:
"insertintoguestbook(name,tel,message)values('张三',8877666,'广州')"
接下来的conn.execute语句,即执行上述exec字符串指定的SQL命令。
最后通过conn.close把打开的数据库关闭,把定义的组件conn设置为空,并显示添加成功提示信息。
图8.19记录写入操作
运行。
下面的图8.20、图8.21、图8.22,分别通过asp03f.asp提交数据,并执行写入页面asp03.asp。
最后查看数据库表的变化。
图8.20在写入表单中键入信息
图8.21按确定后写入成功提示
图8.22数据表的变化说明添加记录成功
8.4.2另一种记录写入方法
下面介绍另一种记录写入的方法。
下面一系列图中给出了相应的代码。
提交表单和前面的基本一样,只不过提交的页面换了一个示例页面asp03a.asp。
这里主要谈谈写入记录页面。
该页面的代码如下:
--#includefile="conna.asp"-->
<%
sql="select*fromusers"
rs.opensql,db,1,3
rs.addnew
rs("name")=request.form("name")
rs("tel")=request.form("tel")
rs("city")=request.form("city")
rs.update
rs.close
setrs=nothing
response.write"记录添加成功!
"
%>
上述代码中主要有几点不同于前面的第一种方法:
◆在conna.asp中,建立了记录集对象。
而rs.opensql,db,1,3,记录集对象rs,以可写入方式打开了通过sql查询得到的数据表记录。
◆对于rs.addnew,先行创建一条空的新记录。
◆然后通过赋值的方式将提交表单提交的数据写入到记录集的新记录之中。
◆通过rs.update更新数据库表,即实际写入。
图8.23向asp03a.asp提交的表单
图8.24数据库连接与记录集的定义
图8.25写入记录的另一方式
图8.26通过提交表单提交数据
图8.27记录添加成功
图8.28数据库表的变化显示记录添加成功
8.5记录的查询
本节学习掌握通过ASP页面对Access数据库表记录的查询显示。
显然,我们要对所有记录进行查询,但是我们真正需要得到的记录,不可能是所有记录,所有我们必须能够通过适当的查询方式,来得到我们所要的记录。
例如:
下面的语句,依据SQL查询语句,通过记录集组件rs,得到所有记录。
这不我们最后所需要的。
—includefile="conn.asp"-->
<%
exec="select*fromusers"
setrs=server.createobject("adodb.recordset")
rs.openexec,conn,1,1
%>
下面请先看一组语句:
a="张三"
b=8898002
exec="select*fromuserswherename='"+a+"'andtel="+b
where后面加上的是条件,与是and,或是or,我想=,<=,>=,<,>的含义大家都知道吧。
这句话的意思就是搜索name是张三的,并且电话是111的记录。
还有一点就是如果要搜索一个字段里面是不是包含一个字符串就可以这么写:
whereinstr(name,a)也就是搜索name里面有a(张三)这个字符串的人。
我这里的a,b,是常量,大家可以让a,b是表单提交过来的变量,这样就可以做一个搜索了。
图8.29查询条件提交表单
图8.30查询条件提交表单显示效果
图8.31查询并显示结果
图8.32执行查询条件提交表单
图8.33显示查询结果
8.6记录的删除
本节学习掌握通过ASP页面对Access数据库表记录的删除操作。
记录的删除操作可使用SQL删除语句来实现。
假设数据exasp.mdb的users表的记录如下图:
图8.34users表记录
请看下面的例子:
在一个表单中输入要删除记录的ID号,然后删除数据库表中与这个输入值相同的ID的记录。
图8.35删除条件提交表单
图8.34中,给出了提交删除申请的表单文件asp05f.asp,它向asp05.asp提交删除条件数据。
图8.35中,给出了删除记录并显示剩余记录的代码。
其中下面两行是关键性的代码。
exec="delete*fromuserswhereID="&request.form("id")
conn.executeexec
第一行给出用于删除的SQL语句字符串,其中条件是表中的ID字段值等于来自提交表单的id变量值。
第二行执行这个SQL删除语句。
其它代码包括前面的包括文件和记录集的定义和打开。
后面的是用于显示剩余记录的代码。
图8.36删除记录并显示剩余记录代码
下面来执行:
图8.37执行提交表单并输入记录号
ID号为6的记录被删除剩余记录显示如下:
图8.38执行提交表单并输入记录号
8.7记录的修改
修改记录是数据库基本操作之一。
下面通过实例来学习修改记录,其中有三个ASP页面:
asp06f.asp(通过输入修改查询条件name来指定记录)、asp06.asp(找到并显示将被修改的记录,且可进行修改数据提交)、asp06s.asp(更新记录,实际修改表)。
◆请看图8.39,其中通过表单提交name数据。
图8.39用于给出修改者姓名的提交表单
◆请看下面的图8.40中的代码。
其中有如下包含语句用于错误处理:
--#includefile="err.asp"-->
err.asp文件有如下代码用于过滤错误信息,当出现错误时,代码继续运行。
<%
Response.Buffer=True
OnErrorResumeNext
%>
在后面用以下代码实现错误处理,如果出现错误则清除页面并给出提示信息:
<%IfErr.Number<>0Then
Response.Clear
Response.Write"没有找到记录!
"
EndIf
%>
下面这一段代码先定义查询字符串,然后通过记录集对象打开查询并存放查询结果。
注意查询字符串中的where条件,name表示字段,后面跟一个字符串,所以要用单引号将request.form("name")引起来,request.form("name")则是返回上面提交页面中的数据作为查询值。
<%
exec="select*fromuserswherename='"&request.form("name")&"'"
setrs=server.createobject("adodb.recordset")
rs.openexec,conn
%>
接下来定义了一个表单。
一方面这个表单得到rs的记录字段值;另一方面表单中的这些值又可以修改,并可提交给asp06s.asp页面。
编号">
姓名">
电话">
城市">
最后是关闭记录集和数据库连接对象。
<%
rs.close
setrs=nothing
conn.close
setconn=nothing
%>
图8.40根据姓名找出并显示记录
◆请看下面的图8.41中的代码。
为了接受asp06.asp中经过修改后的记录数据,必须又要找到那条记录,这时通过前面已找到的记录的ID来定位记录。
注意,在用rs打开查询时用到了参数“1,3”。
exec="select*fromuserswhereID="&request.form("ID")
setrs=server.createobject("adodb.recordset")
rs.openexec,conn,1,3
接着用三条语句将修改后的三个字段值写入rs记录集中,再进行rs.update,更新数据表,完成修改数据记录值。
后面是关闭记录集和数据库连接对象,并提示记录修改成功。
rs("name")=request.form("name")
rs("tel")=request.form("tel")
rs("city")=request.form("city")
rs.update
rs.close
setrs=nothing
conn.close
setconn=nothing
response.write"记录修改成功!
"
图8.41修改记录
◆下面是示例演示的情况:
图8.42修改前的表
图8.43输入姓名
图8.44显示该记录
图8.45修改该记录号
图8.46修改成功
图8.47修改后的表
8.8记录显示的分页
前面在第三节学习了记录的显示,当记录数相当多的时候,我们有必要在显示的过程中对它们进行分页显示。
8.8.1实现分页的基本方法
将数据库表中所有符合查询条件的记录读入到记录集rs