1.61k likes | 1.79k Views
第 9 章 ADO 组件和数据库编程. 本章导读: 支持对数据库的访问和操作是 ASP 的一个重要功能,也是 ASP 逐渐发展壮大的一个重要因素, ASP 程序通过 ADO ( Activex Data Objects , Activex 数据对象)组件技术实现与符合 ODBC ( Open Database Connectivity ,开放式数据库链接系统)标准规范的数据库进行连接,并可很方便地通过浏览器存取、查询、操作数据库中的数据。 知识要点: ※ADO 组件模型 ※Connection 对象和数据库连接 ※Command 对象和查询
E N D
第9章 ADO组件和数据库编程 • 本章导读: • 支持对数据库的访问和操作是ASP的一个重要功能,也是ASP逐渐发展壮大的一个重要因素,ASP程序通过ADO(Activex Data Objects,Activex数据对象)组件技术实现与符合ODBC(Open Database Connectivity,开放式数据库链接系统)标准规范的数据库进行连接,并可很方便地通过浏览器存取、查询、操作数据库中的数据。 • 知识要点: • ※ADO组件模型 • ※Connection对象和数据库连接 • ※Command对象和查询 • ※Recordset对象和分页
9.1 ADO技术简介 • ADO组件是微软公司开发的一种强大的数据库管理组件,是ASP存取数据库的重要工具。利用它可以轻松的完成对各种数据库的查询、存储操作。ADO组件是一种基于Internet并且以数据为中心的数据访问接口,这种数据访问接口与应用程序所使用的语言无关。ADO是对数据库进行操作的最有效的和最简单直接的方法,它是一种功能强大的数据访问编程模式。 • ADO组件提供了7个子对象和4个数据集合,利用这些子对象和数据集合可实现对数据库的访问和控制。
9.1.1 ADO组件的对象 • ADO组件提供了7个子对象,各对象及其功能如表9-1所示。 • 表9-1 ADO组件的对象 • 对 象功 能connection连接对象,建立与数据库的连接command命令对象,执行对数据库操作,如查询、添加、删除、修改记录等命令recordset记录集对象,表示从数据源返回的结果集field字段对象,用来取得一个记录集(recordset)内全部字段的值parameter参数对象,SQL存储过程或者有参数查询命令中一个参数property属性对象,指明一个ADO对象的属性error错误对象,用来返回一个数据库连接(connection)上的错误
9.1.1 ADO组件的对象 • 在这7个对象之中,其中最主要的对象是connection、command和recordset这3个对象。 • 它们在处理整个数据库的过程中,既分工明确又协调合作,同时功能上既相对独立,也有互相交叉,实际运行时各对象之间关系错综复杂。 • 一般说来,connection对象主要负责与数据库的连接,形象地比喻成数据通道的维护者,command对象负责数据的查询,形象地比喻成数据的挖掘者,recordset对象负责数据的收集整理发布,形象地比喻成数据的发布者。。
9.1.1 ADO组件的对象 • 不考虑程序内部处理的机制时,在数据从后台数据库传到前台网页的过程中,他们的逻辑关系可以简化成一种直观的线性关系,如图9-1所示。 • 数据库→connection对象→command对象→recordset对象→网页 errors 数据集合 parameters 数据集合 fields 数据集合error对象parameter对象field对象 图9-1 ADO对象之间的关系
9.1.2 ADO组件的数据集合 • ADO组件提供了4个数据集合,各数据集合及其功能如表9-2所示。 表9-2 ADO数据集合
9.2 ODBC技术简介 • ODBC是数据库服务器的一个标准协议,相当于一个数据库引擎,或者也可以理解为是一种数据库管理的驱动程序,它向访问网络数据库的应用程序提供了一种通用的接口程序,只要数据库系统在Web服务器系统中有相应的ODBC驱动程序,其他任何程序都可以通过该ODBC操作该数据库系统。 • ODBC是一种访问数据库的方法,具有一致性且定义完整的接口,可以用来连接不同的数据库系统,而且不必顾虑接口兼容性的问题。
9.3 Connection对象 • 要对数据库进行操作,首先要建立一个对数据库的连接通道,这是通过ADO的连接对象connection来进行的。connection对象主要用于建立和管理前台网页与后台数据源的连接,也可以利用connection对象的属性、方法和数据集合等对该数据库进行相关查询操作,实现对数据库的查询、删除、更新和添加记录等操作。
9.3.1 建立Connection对象实例 • 使用connection对象首先必须建立其对象实例,其语法格式如下: • 格式:set cnn=server.creatobject("adodb.connection") • 说明:ADO组件的子对象一般要通过server.creatobject建立对象实例才能使用其方法、属性和集合,使用时注意以下几点:;
9.3.1 建立Connection对象实例 • ⑴cnn:表示创建的connection对象实例名; • ⑵connection对象主要提供了6种方法,如表9-3所示; 表9-3 connection对象方法 ⑶connection对象主要提供了8种属性,如表9-4所示。 表9-4 connection对象属性
9.3.2 数据库连接和Open方法 • 利用connection对象的open方法可实现对数据库的连接,其语法格式如下: • 格式:cnn.open "dsn;user;password; driver; dbq; provider" • 说明: • ⑴open方法中提供了很多参数;常见参数及其意义如表9-5所示; 表9-5 open方法中各参数意义
9.3.2 数据库连接和Open方法 • ⑵各参数之间没有先后顺序之分,多个参数之间用分号(;)分隔; • ⑶不同的数据库不同的连接方式,可能有不同的参数选择; • ⑷具体针对access数据库的连接方法,通常有以下3种形式: • ①通过OLE DB提供程序连接到Access数据库 <% dim cnn ' 定义一个连接变量 set cnn=server.createobject("adodb.connection") '定义一个连接对象cnn cnn.connectionstring="provider=microsoft.jet.oledb.4.0; "& _ "data source="&server.mappath("jxgl.mdb") '定义连接对象的连接字符串 conn.open '打开连接对象 %>
9.3.2 数据库连接和Open方法 • 说明:OLE DB是一种对关系型和非关系型数据库都可以访问的一种数据库访问技术。利用OLE DB不仅可以访问数据库,也可以访问电子邮件,excel电子表格,web上文本等非数据库的数据源,不推荐使用。 • ②通过ODBC驱动程序连接到Access数据库 <% dim cnn set cnn = server.createobject("adodb.connection") cnn.open "driver={microsoft access driver & _ (*.mdb)};dbq="&server.mappath("jxgl.mdb") %>
9.3.2 数据库连接和Open方法 • 或 <% dim cnn set cnn = server.createobject("adodb.connection") cnn.connectionstring="dbq="&server.mappath("jxgl.mdb")& _ ";driver={microsoft access driver (*.mdb)}" cnn.open %> • 说明:server.mappath通常将服务器的虚拟路径转换成相应的物理路径,可移植性好,推荐使用;connectionstring是connection对象的属性,用于设置连接数据库的字符串。
9.3.2 数据库连接和Open方法 • ③通过ODBC数据源连接到Access数据库 <% dim cnn set cnn = server.createobject("adodb.connection") cnn.open "dsn=jxglwww" %> • 说明:使用ODBC数据源方法连接时,必须事先建立ODBC数据源,如果移植到别的服务器上,还必须重新设置数据源。
9.3.2 数据库连接和Open方法 • ⑸ODBC数据源设置步骤如下: • ①单击【开始】→【控制面板】→【管理工具】→【数据源ODBC】命令后,弹出如图9-2所示的“ODBC数据源管理器”对话框①。 • ②在图9-2中单击【系统DSN】命令后,弹出如图9-3所示的“ODBC数据源管理器”对话框②。
9.3.2 数据库连接和Open方法 ③在图9-3中单击【添加】按钮,弹出如图9-4所示的“创建新数据源”的对话框。
9.3.2 数据库连接和Open方法 ④在图9-4中选择“Microsoft Access Driver (*.mdb)”,然后单击【完成】按钮,弹出如图9-5所示的“ODBC Microsoft Access 安装”的对话框。 ⑤在图9-5中输入【数据源名】为“jxglwww”和【说明】为“用户数据库”,如图9-6所示,单击【选择】按钮,弹出如图9-7所示的“选择数据库”对话框。
9.3.2 数据库连接和Open方法 • ⑥在图9-7中选择数据库路径为“d:\myweb\jxgl.mdb”,单击【确定】按钮后,返回上一层,如图9-8所示。 • ⑦在图9-8所示的对话框中单击【确定】按钮后,返回上一层,如图9-9所示。 • ⑧在图9-9单击【确定】按钮,至此执行完毕。
9.3.2 数据库连接和Open方法 图9-8 【ODBC Microsoft Access 安装】对话框图 9-9 【ODBC数据源管理器】对话框
9.3.3 数据库查询和Execute方法 • 利用connection对象的execute方法执行SQL命令或存储过程,实现对数据库的查询,其语法格式如下: • 格式1:set rs=cnn. execute(sql查询字符串) • 格式2:cnn.execute(sql查询字符串) • 格式3:cnn.execute sql字符串 [,number [,option]] • 说明: • ⑴前者打开一个recordset记录集,后两者不打开recordset记录集; • ⑵number是可选参数,用于获取受影响记录数;
9.3.3 数据库查询和Execute方法 • ⑶option是可选参数,表示对数据库请求执行命令的commandtext类型说明,option取值及其含义如表9-6所示。 表9-6 option参数取值及其意义
9.3.3 数据库查询和Execute方法 • ⑷SQL查询字符串主要有下面四种形式: • ①利用Select语句查询记录 <% dim strsql,rs strsql= "select * from xsxx where 入学成绩>600" set rs=cnn.execute(strsql) %> 【例9-01】:connection对象查询示例。 <html> <head> <title>数据库的基本操作之select</title> </head> <body> <%
9.3.3 数据库查询和Execute方法 • '下面将建立连接数据库jxgl.mdb,建立connection对象 • dim cnn,strconn • strconn="dbq=" & server.mappath("jxgl.mdb") & _ • ";driver={microsoft access driver (*.mdb)}" • set cnn=server.createobject("adodb.connection") • cnn.open strconn • dim strsql,rs '定义变量 • strsql= "select * from xsxx where 入学成绩>600" '查询记录 • set rs=cnn.execute(strsql) '以下建立recordset对象实例rs • %>
9.3.3 数据库查询和Execute方法 <center> <table border="1"> <%do while not rs.eof %> <tr> <td><%=rs("学号")%></td> <td><%=rs("专业")%></td> <td><%=rs("姓名")%></td> <td><%=rs("性别")%></td> <td><%=rs("出生日期")%></td> <td><%=rs("入学成绩")%></td> <td><%=rs("是否团员")%></td> <td><%=rs("籍贯")%></td> </tr> <%
9.3.3 数据库查询和Execute方法 • rs.movenext • loop • %> • </table> • </center> • <% • cnn.close • set cnn=nothing • %> • </body> • </html> 图9-10 【例9-01】运行结果
9.3.3 数据库查询和Execute方法 • ②利用Insert语句查询记录 <% dim strsql,rs strsql= "insert into xx(学号,课程代号,成绩) values('02301','05',90)" cnn.execute(strsql) %> ③利用Delete语句删除记录 <% dim strsql,rs strsql= " delete from kc where 课程代号='07'" cnn.execute(strsql) %> • ④利用Update语句删除记录 <% dim strsql,rs strsql="update kc set 教师='叶老师' where 课程名称='asp程序设计'" cnn.execute(strsql) %>
【例9-02】:connection对象插入、删除、更新记录示例。【例9-02】:connection对象插入、删除、更新记录示例。 • 核心提示:在Windows XP服务器上运行asp程序时,务必添加“IUSR_计算机名”用户并开放读取、写入权限,否则会出“现数据库无法更新”的情况。操作步骤如下: • (1)打开“网站主目录”所在的文件夹,然后执行“工具”→“文件夹选项”→“查看”命令,在“文件夹选项”对话框的高级设置对话框中,取消“使用简单文件共享(推荐)” ; • (2)右击“网站主目录”,执行“属性”→“安全”→“添加”命令,添加“IUSR_计算机名”用户并选取读取、写入权限。 <html> • <head> • <title>数据库的基本操作之其他</title> • </head> • <body> • <% • '连接数据库,建立connection对象,jxgl.mdb下面将建立 • dim cnn,strconn • strconn="dbq="&server.mappath("jxgl.mdb")& _ • ";driver={microsoft access driver (*.mdb)}" • set cnn=server.createobject("adodb.connection") • cnn.open strconn • '添加记录
strsql="insert into xx(学号,课程代号,成绩) values('02301','05',90)" cnn.execute strsql,n response.write "共插入"&n&"条记录。<br>" '更新记录,将asp程序设计的教师改为叶老师 strsql="update kc set 教师='叶老师' where 课程名称='asp程序设计'" cnn.execute strsql,n response.write "共更新"&n&"条记录。<br>" '删除记录,删除课程代号为07的记录 strsql= "delete from kc where 课程代号='07'" cnn.execute strsql,n response.write "共删除"& n &"条记录。<br>" cnn.close '关闭与数据库的连接 set cnn=nothing '从内存中释放cnn,可省略 %> 操作结束,请打开数据表查看内容变化。 </body> </html>
9.3.4 数据库关闭和Close方法 利用connection对象的close方法,可以关闭一个已经打开的connection对象及其相关的各种对象,并释放系统资源。close方法主要是切断与数据库之间的连接通道,同时所有依赖connection对象的command对象或者recordset对象也一道关闭。其语法结构如下: <% cnn.close '关闭与数据库的连接 set cnn=nothing '从内存中释放cnn,可省略 %>
9.3.5 事务处理 事物处理可以理解为一个整体的一组操作语句序列,只有全部语句都成功执行,事物处理本身才算成功,只要其中一个语句出错,整个处理算作失败,并恢复到处理前的状态。事物处理对于数据的完整性、一致性和安全性,提供了有力的保障。 大多数程序不用事务处理也没有关系,发生错误后大不了重新来过一次,可是对于一些经济活动来说,是绝对不允许错误发生的。举例来说,电子支付时,现在要从你的帐户转走200元到对方指定银行帐户中,一般分两步,先从你的帐户减少200元,然后在对方指定银行帐户中增加200元。假如在你的帐户已经转出200元的时候突然遇到意外故障,但是这200元又没有转入对方的帐户。解决这种问题最好办法,采用某种机制,只要有一步出错,就不执行,并返回事务处理前的状态,形象地说就是“一票否决制”或者叫“同生共死”。
connection 对象中的begintrans、rollbacktrans和committrans方法正好满足这种“机制”要求。begintrans和committrans用于标记事物处理的开始和结束,在这两个语句之间的语句,就是作为事物处理的语句。判断事物处理是否成功,可通过connection对象的子对象error对象和errors数据集合来实现,若errors数据集合的成员个数不为0,则说明有错误发生,事物处理失败,并用rollbacktrans取消事务处理。
【例9-03】:现在有一个bank.mdb的数据库和其中的表daybook,表中有两个帐号00001和00002,现在从帐号00001中转走200到帐号00002的事物处理示例【例9-03】:现在有一个bank.mdb的数据库和其中的表daybook,表中有两个帐号00001和00002,现在从帐号00001中转走200到帐号00002的事物处理示例 • 分析:银行交易采取的是日记帐,每笔交易都必须写入数据表中,为了计算出当前交易的余额,首先必须算出双方交易的余额。表中原始数据如图9-11所示。 图9-11 表daybook原始数据
<title>事物处理示例</title> • </head> • <body> • <% • dim cnn,strconn,strsqla,strsqlb,strsql1 • dim strsql2,monyea,monyeb,rsa,rsb • strconn="dbq="&server.mappath("bank.mdb")& _ • ";driver={microsoft access driver (*.mdb)}" • set cnn=server.createobject("adodb.connection") • cnn.open strconn • cnn.begintrans • strsqla="select sum(贷方)-sum(借方)"& _ • "from daybook where 帐户号='00001'" • set rsa=cnn.execute(strsqla) • monyea=rsa(0) '获取帐户号='00001'的余额 • 'rsa.close
'set rsa=nothing • strsqlb="select sum(贷方)-sum(借方)"& _ • "from daybook where 帐户号='00002'" • set rsb=cnn.execute(strsqlb) • monyeb=rsb(0) '获取帐户号='00002'的余额 • 'rsb.close • 'set rsb=nothing • strsql1="insert into daybook(帐户号,借方,余额,交易日期)"& _ • "values('00001',200,"&monyea-200&",#"&date()&"#)" • cnn.execute(strsql1) • strsql2="insert into daybook(帐户号,贷方,余额,交易日期)"& _
"values('00002',200,"&monyeb+200&",#"&date()&"#)" • cnn.execute(strsql2) • if cnn.errors.count>0 then • cnn.errors.clear • cnn.rollbacktrans • response.write "转帐不成功。" • else • cnn.committrans • response.write "转帐成功。" • end if • cnn.close '关闭与数据库的连接 • set cnn=nothing '从内存中释放cnn • %> • </body> • </html>
9.3.6 Errors数据集合和Error对象 • error(错误)对象是connection对象的子对象,用来返回数据库操作的过程中发生的错误或警告信息,一个错误就是一个错误对象,所有错误对象组成了errors数据集合。
1. Errors数据集合的属性 errors数据集合只有一个属性,即count,用来统计error对象的个数。语法格式如下: <% cnn.errors.count %> • 2. Errors数据集合的方法 errors数据集合提供了两个方法,下面简要介绍如下: ⑴ Item方法 用于建立错误对象,语法格式如下: 格式:set error 对象=cnn.errors.item(n) 说明:n是错误索引值,取值是0到cnn.errors.count-1,实际应用中item可省略。
⑵ Clear方法 清除错误数据集合中所有的error对象,语法格式如下: 格式:cnn.errors.clear • 3. Error对象的属性 当程序每发生一个错误时,都会产生一个error对象,不同的错误对象通过错误描述,(可能的)错误原因及处理措施等属性加以区别。error对象常见的属性如表9-7所示。
【例9-04】:error对象应用示例。 • <head> • <title>error的对象应用示例</title> • </head> • <body> • <% • dim cnn,strsql • on error resume next '错误处理方式 • set cnn=server.createobject("adodb.connection") • cnn.open "dsn=jxglwww" • 'cnn.errors.clear • dim i,errobj • if cnn.errors.count>0 then • response.write "系统发生"&cnn.errors.count &"个错误<br>" • for i =0 to cnn.errors.count-1 '循环错误对象
set errobj=cnn.errors.item(i) '建立每个错误对象 • response.write "错误编号:"&errobj.number&"<br>" • response.write "错误描述:"&errobj.description&"<br>" • response.write "错误原因:"&errobj.source&"<br>" • response.write "错误提示:"&errobj.helpcontext&"<br>" • response.write "帮助文件:"&errobj.helpfile&"<br>" • response.write "原始错误:"&errobj.nativeerror&"<br>" • next • else • response.write "数据库连接正常" • end if • %> • </body> • </html>
运行结果如图9-13所示 图9-13 【例9-04】运行结果
【例9-05】:综合案例——实用多表联合查询。【例9-05】:综合案例——实用多表联合查询。 • 9-05.htm,表单界面代码如下: • <html> • <head> • <title>实用查询</title> • </head> • <body> • <center> • <h2>实用新型信息查询</h2> • <hr> • <form name="form1" action="9-05.asp" method="post"> • <table> • <tr> • <td colspan="6"><font color="blue">查询条件</font></td> • </tr> • <tr> • <td colspan="6"><hr></td> • </tr> • <tr>
<td>学生学号</td> • <td><input type="text" name="stuid" size="8"> </td> • <td>课程代号</td> • <td><input type="text" name="couid" size="4"> </td> • <td><input type="submit" value="查询"> </td> • <td><input type="reset" value="重设"> </td> • </tr> • <tr> • <td colspan="6"><hr></td> • </tr> • </table> • </form> • </body> • </html>
运行结果如图9-14所示。 图9-14 9-05.htm运行结果
9-05.asp,表单和数据库处理代码如下: • <% • if request.form("stuid")<>"" and request.form("couid") <> ""then • stuid=request.form("stuid") • couid=request.form("couid") • '下面将建立连接数据库jxgl.mdb,建立connection对象 • dim cnn,strconn • strconn="dbq=" & server.mappath("jxgl.mdb") & _ • ";driver={microsoft access driver (*.mdb)}" • set cnn=server.createobject("adodb.connection") • cnn.open strconn • '建立查询语句 • dim strsql,rs • strsql="select xsxx.学号,xsxx.姓名,xsxx.性别,xx.成绩"& _
" from xsxx, xx"& _ • " where xsxx.学号=xx.学号"& _ • " and xsxx.学号='"&stuid& _ • "' and xx.课程代号='"&couid&"'" • set rs =cnn.execute(strsql) '返回记录集 • %> • <center> • <table border="1"> • <tr> • <td>学号</td> • <td>姓名</td> • <td>性别</td> • <td>成绩</td> • </tr> • <%do while not rs.eof %> • <tr>