ASP+Access实现增删改查分页基本操作.docx
ASP+Access实现增删改查分页基本操作说实在的,我没有用过ASP+Access做过开发的。用Access在大学时做过开发,是用Java做的一个桌面小程序。但是,如何用ASP+Access进行开发、以及在开发过程中的问题,有好几个同学问过我,由于自己没弄过,所以也就答不上来。上次也一样,好友要我弄个ASP+Access的简单例子给他,没办法,只好边上网查边给好友弄了个查列表的演示功能,其它的增、删、改好友自己搞定。今天我一起把这几个基本功能一并整理,做个备份,以备将来自己用到或是好友问到。一、简单介绍要用Access,首先得在电脑上安装个MS Office Access程序。它和其它数据库不同的是,它只有一个文件,直接操作这个文件即可;它有个便利的地方:当感觉哪条数据不爽或是不对时,可以直接打开修改,也就是MS Office Access集成了服务器和可视化客户端。Access是不支持并发的,因为当天我用客户端打开数据库文件,同时用ASP访问时,就报错,具体信息忘记了,大意是已经打开了,不能再访问了。至于支持不支持事务等,我想是不支持的,连并发都不支持,那么支持事务就没有任何意义了。二、打开和关闭Access连接用JDBC操作数据库先是要打开一个连接的,操作完了就要关闭该连接。ASP操作Access也不例外,用时也要打开一个连接,用完了也要关闭的。1、打开连接<%Set conn = Server.CreateObject("ADODB.Connection")conn.Open "Driver=Microsoft Access Driver (*.mdb); DBQ=" & Server.MapPath("TEST.mdb")%>上面的conn最后的就是打开的连接了,最后的Server.MapPath("TEST.mdb")是指定Access数据文件的位置的,Server.MapPath("path")就是把相对路径转化成绝对路径,这样Driver就可以找到该数据文件了。2、关闭连接<%conn.closeset conn = nothing%>上面的conn.close就是关闭了,set conn = nothing就是把conn指向null了。有个问题:conn.close有没有可能抛出异常,该如何捕捉?三、ASP对Access实现增操作要有后面的删、改、查,首先数据库中得有数据,所以“增”放在第一个。<%Set rs = Server.CreateObject("ADODB.Recordset") sql = "select * from feedback where (feedbackid is null)" rs.open sql,conn,1,3rs.addnewrs("typeid") = typeidrs("feedbackC") = feedbackCrs.updaters.closeset rs = nothing%>很是神奇,要想插入数据,还先得查下数据库,网上还有以下这种做法。<%sql = "select * from feedback" rs.open sql,conn,3,3%>感觉是先把数据记录全部查出来,然后增加一条,万一数据库有一亿记录,真不敢想象这种操作的可行性,希望我的感觉是错的。和数据库连接一样,结果集rs不用了也要关闭的,并且要在连接关闭之前关闭。四、ASP对Access实现删操作数据库中的不爽的数据,当然要把它删掉或是修改掉了,数据量太大了,还是删除比较简单的,有时间再修改好了。<%Set rs = Server.CreateObject("ADODB.Recordset") sql = "select * from feedback where feedbackid="&request("feedbackid")application.lockrs.open sql,conn,1,3if rs.recordcount > 0 thenrs.Deleteend ifrs.closeapplication.unlockSet rs = nothing%>和增加一样,删除前也是先要查,呵呵,感觉ASP操作Access真的是很好玩的。五、ASP对Access实现改操作现在有时间了,那些不爽的数据记录可以修改下,不要都删除掉了,不然数据库中都没数据了。<%Set rs = Server.CreateObject("ADODB.Recordset") sql = "select * from feedback where feedbackid="&request("feedbackid")rs.open sql,conn,1,3if rs.recordcount > 0 thenrs("typeid") = request("typeid")rs("feedbackC") = request("feedbackC")rs.updateend ifrs.closeSet rs = nothing%>和增加一个样,只是少了个rs.addnew语句,还是先要查出来,呵呵。六、ASP对Access实现查操作其实“查”我们一直在做,上面的几个操作中,每个操作之前,我们必须得先“查”,这也许就是Access的魅力:你想用ASP操作Access吗,那么你就先查吧!<%Set rs = Server.CreateObject("ADODB.Recordset") sql = "select * from feedback order by feedbackid desc"rs.open sql,conn,1,1 do while not rs.eof%>内容:<%=rs("feedbackC")%>,这里就可以充分使用你的数据记录吧。<%rs.movenextlooprs.closeSet rs = nothing%>细心的朋友会发现,上面的列表是查出所有的记录,跟上面的假设一样,如果数据库中有一亿条记录,那么整个网络就在传数据了,网页浏览者喝杯咖啡,上个厕所后,数据还没有传完,洗个澡后发现整个页面全是记录了,这肯定是不好的,我们必须分页才行啊,数据得一页一页的浏览。七、ASP对Access分页取数据良好的用户体验是每个网站站长不懈的追求,其中分页浏览数据记录就是其中之一。<%if request("page")<>"" thenpage = cint(request("page")elsepage = 1end if%>首先是获得第几页,如果第几页参数为空,则默认为第1页。<%set rs = server.CreateObject("adodb.recordset")sql = "select * from feedback order by feedbackid desc"rs.Open sql,conn,1,4if not rs.EOF thenrs.pagesize = 15rs.absolutepage = page%><!- 开始:使用记录 -><%For absRecordNum = 1 to rs.PageSize%>内容:<%=rs("feedbackC")%>,其它的内容<%rs.MoveNextif rs.eof then exit fornext%><!- 结束:使用记录 -><%elseResponse.Write("<center>抱歉,没有找到相关记录!</center>")end if%>上面就是分页了,每页15条记录,这样网站浏览者就爽多了,不用紧等了,其实我们还漏了下面将要说的一个问题。八、ASP对Access分页函数上页我们只是从请求参数中获得分页页码,但要每个用户浏览一页都要修改URL中的分页是不可以的,所以我们必须在网页上提供一个“上一页”,“下一页”等分页栏。下面是一个分页栏函数。<%sub fy2(page, name, rs)response.write "<table width='100%' border='0' cellpadding='0' cellspacing='0'>"response.write "<form name='form2' method='get' >"response.write "<tr>"response.write "<td align='right' class='unnamed1'>"Response.Write "<font color='#FF0000' class='unnamed1'></font> 信息有"&rs.recordcount&"条</td>"If Page > 1 ThenResponse.Write "<td width='65'><table width='57' height='21' border='0' cellpadding='0' cellspacing='0' class='ML_But_6' id='bz'>"Response.Write "<tr>"Response.Write "<td align='center' valign='middle'><a HREF="&name&"spage=1 class='ML_But_6'>第一页</a></td>"Response.Write "</tr></table></td>"Response.Write "<td width='65'><table width='57' height='21' border='0' cellpadding='0' cellspacing='0' class='ML_But_6' id='bz'>"Response.Write "<tr>"Response.Write "<td align='center' valign='middle'><a HREF="&name&"Page="&(Page-1)&" class='ML_But_6'>上一页</a></td>"Response.Write "</tr></table></td>"End Ifif page="" and rs.pageCount<>0 thenResponse.Write "<td width='65'><table width='57' height='21' border='0' cellpadding='0' cellspacing='0' class='ML_But_6' id='bz'>"Response.Write "<tr>"Response.Write "<td align='center' valign='middle'><a HREF="&name&"Page="&(1+1)&" class='ML_But_6'>下一页</a></td>"Response.Write "</tr></table></td>"Response.Write "<td width='65'><table width='57' height='21' border='0' cellpadding='0' cellspacing='0' class='ML_But_6' id='bz'>"Response.Write "<tr>"Response.Write "<td align='center' valign='middle'><a HREF="&name&"Page="&rs.pageCount&" class='ML_But_6'>最后一页</a></td>"Response.Write "</tr></table></td>"End IfIf Page < cint(rs.pageCount) ThenResponse.Write "<td width='65'><table width='57' height='21' border='0' cellpadding='0' cellspacing='0' class='ML_But_6' id='bz'>"Response.Write "<tr>"Response.Write "<td align='center' valign='middle'><a HREF="&name&"Page="&(1+1)&" class='ML_But_6'>下一页</a></td>"Response.Write "</tr></table></td>"Response.Write "<td width='65'><table width='57' height='21' border='0' cellpadding='0' cellspacing='0' class='ML_But_6' id='bz'>"Response.Write "<tr>"Response.Write "<td align='center' valign='middle'><a HREF="&name&"Page="&rs.pageCount&" class='ML_But_6'>最后一页</a></td>"Response.Write "</tr></table></td>"End If response.write "<td width='150' class='unnamed1'><font color=#ff0000>"&"第"&page&"页/共"&rs.pagecount&"页</font><font color=#000000>"if rs.pageCount<>0 thenresponse.write "<INPUT TYPE='hidden' NAME='proname' value='"&request("proname")&"'>"response.write "<INPUT TYPE='hidden' NAME='aaa' value='"&request("aaa")&"'>"response.write "<INPUT TYPE='hidden' NAME='title' value='"&request("title")&"'>"response.write "<INPUT TYPE='hidden' NAME='id' value='"&request("id")&"'>"response.write "<INPUT TYPE='hidden' NAME='type' value='"&request("type")&"'>"response.write "<INPUT TYPE='hidden' NAME='flag' value=1>"response.write "<select name='page' onchange=submit >"for n=1 to rs.pageCount if n=page thenresponse.write "<option value="&n&" selected class='unnamed1'>"&n&"页</option>"elseresponse.write "<option value="&n&" class='unnamed1'>"&n&"页</option>"end iftotalpage=totalpage+nnextresponse.write "</select></font></td></tr></form></table>"end ifend sub%>上面就定义了一个叫fy2的分页函数,它有三个参数,分别为第几页,URL和结果集。其中URL中不要带page属性。它的用法如下所示。<%fy2 page, "newlist.asp?flag=1"&"&id="&request("id")&"&type="&request("type")&"&title="&request("title")&"&lx="&request("lx")&"&", rs%>在for循坏的前后都可以通过上面的方式使用分页栏了,注意的是:URL最后要带上&号,并且不能有page属性。九、最后上面只是对ASP操作Access的方式作了简单的介绍,用是可以用了,但是性能和效率问题都没有考虑,对于自己的疑问我也没有去证实,希望从事ASP+Access开发的朋友能留言指正。=如有批评、指教、疑惑,请:obullxl祝大家使用JAVA愉快!刚从网站<%'增加、删除数据表和字段'增加数据表:Create Table 表名(字段名 type(size) null|not null default eExpression primary key,field2.)' 字段类型type:counter;text(num);char(num);varchart(num);memo;short;long;single;double;date/time;logical;currency;oleobject'删除数据表:Drop Table 表名'增加字段:Alter Table 表名 Add Column 字段名 type(size)not null'删除字段:Alter Table 表名 Drop Column 字段名Dim objConn,strsqlSet objConn = Server.CreateObject("ADODB.Connection")objConn.open "Driver=Microsoft Access Driver (*.mdb);Dbq=" & Server.MapPath("zzksycn.mdb")'mytable为表名,myfield为字段名strsql = "Create table mytable(id counter primary key,name char(20),url char(50),hits short)"objConn.execute(strsql)strsql = "Alter table mytable add column myfield text(50)"objConn.execute(strsql)strsql = "Alter table mytable drop column myfield"objConn.execute(strsql)strsql = "Drop table mytable"objConn.execute(strsql)%>那么可不可以通过同样的方式进行DML操作呢?