«
ASP快速开发方法之数据操作

时间:2008-5-31    作者:Deri    分类: 分享


   <p>  这是我自己的心得,给大家作个参考。<br />我的目的是让开发变得简单,尽可能少地考虑实现语句,更多地把精力用于思考业务逻辑。希望我的文章对大家有所启发和帮助。</p><p>  好吧,让我们进入正题:</p><p>  先看以下例子:</p><code><%<br />db_path = "database/cnbruce.mdb"<br />Set conn= Server.CreateObject("ADODB.Connection")<br />connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path)<br />conn.Open connstr<br />Set rs = Server.CreateObject ("ADODB.Recordset")<br />sql = "Select * from cnarticle"<br />rs.Open sql,conn,1,1<br />if rs.EOF and rs.BOF then<br />response.write ("暂时还没有文章")<br />else<br />Do Until rs.EOF<br />response.write("文章标题是:"& rs("cn_title"))<br />response.write("<br>文章作者是:"& rs("cn_author"))<br />response.write("<br>文章加入时间是:"& rs("cn_time"))<br />response.write("<br>文章内容是:"& rs("cn_content"))<br />response.write("<hr>")<br />rs.MoveNext<br />Loop<br />end if<br />rs.close<br />Set rs = Nothing<br />conn.close<br />set conn=Nothing<br />%></code><p>  嗯,这是一个典型的读取数据并显示的例子,参见:http://www.cnbruce.com/blog/showlog.asp?cat_id=26&log_id=448<br />嗯,确实简单。从上至下,很容易明白。但是当你对多个表进行读插删改的时候,当你的代码里有很多HTMLjs混杂的时候,你会有疑问:为什么有这么多东西要重复呢?<br />所以一般我们把一些简单的操作独立出来,写成类或者函数放进包含文件(include)。</p>
<p> </p>

   <p>  那么以上的操作我们可以使用两个文件来实现:</p><code>conn.asp<br /><%<br />db_path = "database/cnbruce.mdb"<br />Set conn= Server.CreateObject("ADODB.Connection")<br />connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path)<br />conn.Open connstr<br />%></code><code>showit.asp<br /><!--#include file="conn.asp" --><br /><%<br />Set rs = Server.CreateObject ("ADODB.Recordset")<br />sql = "Select * from cnarticle"<br />rs.Open sql,conn,1,1<br />if rs.EOF and rs.BOF then<br />response.write ("暂时还没有文章")<br />else<br />Do Until rs.EOF<br />response.write("文章标题是:"& rs("cn_title"))<br />response.write("<br>文章作者是:"& rs("cn_author"))<br />response.write("<br>文章加入时间是:"& rs("cn_time"))<br />response.write("<br>文章内容是:"& rs("cn_content"))<br />response.write("<hr>")<br />rs.MoveNext<br />Loop<br />end if<br />rs.close<br />Set rs = Nothing<br />conn.close<br />set conn=Nothing<br />%></code><p>  参考:http://www.cnbruce.com/blog/showlog.asp?cat_id=26&log_id=448</p><p>  现在相对简单多了,如果有多个操作页面我们只要导入连接文件就可以了,不过还是不够简洁,哪里不简洁?<br />一直在创建server,一直在写close,这样很容易出错,并且看起来与内容无关的太多。 </p>
 <p> </p>

   <p>  那我再改进下:<br />把conn.asp文件改成:<br /><code><%<br />Dim Conn<br />Dim Rs<br />Sub CloseDatabase<br />  Conn.close<br />  Set Conn = Nothing<br />End Sub<br />Sub OpenDatabase<br />  Dim StrServer,StrUid,StrSaPwd,StrDbName<br />  StrServer="192.168.1.1"    '数据库服务器名<br />  StrUid="sa"      '您的登录帐号<br />  StrSaPwd=""      '您的登录密码<br />  StrDbName="cnbruce.mdb"    '您的数据库名称<br />    Set Conn = Server.CreateObject("ADODB.Connection")<br />    '用于连接ACCESS<br />    Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath(StrDbName)<br />    '用于连接MSSQL<br />    'Conn.ConnectionString = "Driver={sql server};driver={SQL server};server="&StrServer&";uid="&StrUid&";pwd="&StrSaPwd&";database=<br />"&StrDbName<br />    set rs=server.CreateObject("ADODB.RecordSet")<br />    conn.open<br />    if Err Then<br />      err.Clear<br />      Set Conn = Nothing<br />      GBL_CHK_TempStr = GBL_CHK_TempStr & "数据库连接错误!"<br />      Response.Write GBL_CHK_TempStr<br />      Response.End<br />    End If  <br />End Sub<br />%></code></p>
 <p> </p>

   <p>  现在我们的showit.asp可以这样写:</p><code>showit.asp<br /><!--#include file="conn.asp" --><br /><%<br />sql = "Select * from cnarticle"<br />opendatabase<br />rs.Open sql,conn,1,1<br />If not Rs.eof then<br />  Do Until rs.EOF<br />  response.write("文章标题是:"& rs("cn_title"))<br />  response.write("<br>文章作者是:"& rs("cn_author"))<br />  response.write("<br>文章加入时间是:"& rs("cn_time"))<br />  response.write("<br>文章内容是:"& rs("cn_content"))<br />  response.write("<hr>")<br />  rs.MoveNext<br />  Loop<br />else<br />  response.write ("暂时还没有文章")<br />end if<br />Closedatabase<br />%></code><p>  嗯,我们又少写了一些东西,这样是最简单的吗?当然不是!还可以更简单。<br />使用GetRows把查询出来的数据传给一个变量,使用ubound方法取得数据记录条数。<br />不明白?没关系,让我们继续往下看:</p><p>  再建个文件:sql.asp</p><p>  sql.asp<br /><code><%<br />Class DataTable<br />  public Function SelectData(sql)<br />    If sql<>"" then<br />      opendatabase<br />      Rs.open sql,conn,1,1<br />      If not Rs.eof then<br />        Thedata=Rs.GetRows(-1)<br />        Closedatabase<br />      Else<br />        Closedatabase<br />      End If<br />    End If<br />    SelectData=Thedata<br />  End Function<br />End Class<br />%></code></p>
 <p> </p>

   <p>  嗯,复制它就可以了,现在我们的showit.asp可以简单地这样写:</p><p>  showit.asp<br /><code><!--#include file="conn.asp" --><br /><!--#include file="sql.asp" --><br /><%<br />sql = "Select * from cnarticle"<br />set loadData=new DataTable<br />Thedata=loadData.SelectData(sql)<br />If isarray(Thedata) then<br />  Num=ubound(Thedata,2)<br />  for i=0 to Num<br />    response.write("文章标题是:"& Thedata(1,i))<br />    response.write("<br>文章作者是:"& Thedata(2,i))<br />    response.write("<br>文章加入时间是:"& Thedata(3,i))<br />    response.write("<br>文章内容是:"& Thedata(4,i))<br />    response.write("<hr>")<br />  next<br />else<br />  response.write("暂时还没有文章")<br />End If<br />%></code></p><p>  呵呵,这样,我们只要用两句语句就完成了数据的读取。同样的,通过在sql.asp中加入:</p><code><%<br />  public Function SelectDataNum(sql)<br />    If sql<>"" then<br />      Opendatabase<br />      Rs.open sql,conn,1,1<br />      If not Rs.eof then<br />        Thedata=Rs.GetRows(-1)<br />        Closedatabase<br />        Num=ubound(Thedata,2)<br />      Else<br />        Closedatabase<br />      End If<br />    End If<br />    SelectDataNum=Num<br />  End Function<br />%></code><p>  我们就可以使用:</p>
 <p> </p>

   <code><%<br />sql = "Select * from cnarticle"<br />set loadData=new DataTable<br />Num=loadData.SelectDataNum(sql)<br />%></code><p>  来取得记录条数,可以用于分页或者用户名是否重复的判断。</p><p>  其它的对数据记录的操作我们新建一个类,使用UpdateTable来完成操作:</p><code><%<br />Class DataTable<br />  public Function UpdataSql(sql)<br />    If sql<>"" then<br />      Opendatabase<br />      conn.execute(sql)<br />      Closedatabase<br />    End If<br />  End Function<br />End Class<br />%></code><code><%<br />sql = "delete from cnarticle"<br />set UpdateDate=new DataTable<br />UpdateDate.UpdataSql(sql)<br />%></code><p>  当然你也这以这样写:</p><code><%<br />sql="insert into cnarticle(cn_title,cn_author,cn_content) values(' "&whattitle&" ',' "&whoauthor&" ',' "&whatcontent&" ')"<br />opendatabase<br />conn.execute(sql)<br />closedatabase<br />%></code><p>  考虑到可能删除语句我们会这么写:<br />sql="delect from cnarticle where id in(1,3,5,6,7,8)"</p><p>  我新建一个类DeldataTable,直接使用DeldataTable.DeldataSql(tableName,DelField,id)完成记录的删除操作。</p><code><%<br />Class DataTable<br />  dim tempvalue<br />  public Function DeldataSql(tableName,DelField,id)<br />    If tableName<>"" and id<>"" then<br />      sql="delete from "&tableName<br />      If isnumeric(id) and instr(id,",")=0 then<br />        sql = sql & " where "&DelField&" = "&id<br />      Else<br />        sql = sql & " where "&DelField&" in ("& id &")"<br />      End If<br />      Opendatabase<br />        conn.execute(sql)<br />      Closedatabase<br />      tempvalue=true<br />    Else<br />      tempvalue=false<br />    End If<br />    DeldataSql=tempvalue<br />  End Function<br />End Class<br />%></code><p>  以下是我的sql.asp文件,请自己进行增删</p>
 <p> </p>

   <code><%<br />'用于查询数据<br />Class DataTable<br />  '查出记录<br />  public Function SelectData(sql)<br />    If sql<>"" then<br />      opendatabase<br />      Rs.open sql,conn,1,1<br />      If not Rs.eof then<br />        Thedata=Rs.GetRows(-1)<br />        Closedatabase<br />      Else<br />        Closedatabase<br />      End If<br />    End If<br />    SelectData=Thedata<br />  End Function<br />  '查出记录条数<br />  public Function SelectDataNum(sql)<br />    If sql<>"" then<br />      Opendatabase<br />      Rs.open sql,conn,1,1<br />      If not Rs.eof then<br />        Thedata=Rs.GetRows(-1)<br />        Closedatabase<br />        Num=ubound(Thedata,2)<br />      Else<br />        Closedatabase<br />      End If<br />    End If<br />    SelectDataNum=Num<br />  End Function<br />  '使用select count(*) from tablename 查出记录有数<br />  public Function SelectCountNum(sql)<br />    If sql<>"" then<br />      Opendatabase<br />      Rs.open sql,conn,1,1<br />      If not Rs.eof then<br />        Thedata=Rs.GetRows(-1)<br />        Closedatabase<br />        Num=Thedata(0,0)<br />      Else<br />        Closedatabase<br />      End If<br />    End If<br />    SelectCountNum=Num<br />  End Function<br />  '将查询的数据全部生成隐藏值<br />  public Function GetHiddenData(sql)<br />    dim tempvalue<br />    If sql<>"" then<br />      Opendatabase<br />      Rs.open sql,conn,1,1<br />      If not Rs.eof then<br />        Thedata=Rs.getRows(-1)<br />        TheFieldCount=rs.fields.count<br />        For i=0 to TheFieldCount-1<br />          TheFieldList = TheFieldList & Rs.fields(i).name & ","<br />        Next<br />        Closedatabase<br />        TheField = split(TheFieldList,",")<br />        For i=0 to TheFieldCount-1<br />          tempvalue = tempvalue & "<input type=""hidden"" id="""&TheField(i)&""" name="""&TheField(i)&""" value="""&Thedata(i,0)&""" />"<br />        Next<br />      Else<br />        Closedatabase<br />      End If<br />    End If<br />    GetHiddenData=tempvalue<br />  End Function<br />  public Function UpdataSql(sql)<br />    If sql<>"" then<br />      Opendatabase<br />      conn.execute(sql)<br />      Closedatabase<br />    End If<br />  End Function<br />  <br />  public Function DeldataSql(tableName,DelField,id)<br />    dim tempvalue<br />    If tableName<>"" and id<>"" then<br />      sql="delete from "&tableName<br />      If isnumeric(id) and instr(id,",")=0 then<br />        sql = sql & " where "&DelField&" = "&id<br />      Else<br />        sql = sql & " where "&DelField&" in ("& id &")"<br />      End If<br />      Opendatabase<br />        conn.execute(sql)<br />      Closedatabase<br />      tempvalue=true<br />    Else<br />      tempvalue=false<br />    End If<br />    DeldataSql=tempvalue<br />  End Function<br />End Class<br />%></code></p>