• 通过一次查询按类别输出数据的两种方法


        经常在论坛上碰到一些新学ASP开发的朋友咨询如何通过查询按类别输出数据,而通常用的方法是先查询出各类别,然后通过循环一个一个的再查询出该类别的数据输出。这个办法是最简单的,但是也是比较耗费资源和效率比较低的。下面我介绍两个方法,都是只查询一次就可以输出的,希望对大家有所帮助。

        本例子所使用的数据库结构如下:

    test

    ID

    ClassName

    title

    1

    a

    a1

    2

    b

    b1

    3

    a

    a2

    4

    a

    a3

    5

    b

    b2

    6

    c

    c1

    7

    c

    c2

    8

    c

    c3

    9

    a

    a4

    10

    b

    b3

    11

    d

    d1

    12

    a

    a5

    13

    c

    c4

    14

    b

    b4

           

     

     

    (一)  通过一个变量控制输出

    代码如下:

    <%@Language=VBScript  CodePage=936%>

    <%

    Option Explicit

    dim conn,rs,currentClassname

    Set Conn=Server.CreateObject("ADODB.Connection")

    conn.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq= test.mdb;"

    set rs=conn.execute("select id,classname,title from test order by classname,title")

    currentClassname=""

    do while not rs.eof

           if currentClassname<>rs("classname") then

                  if currentClassname="" then

                         response.write  "<table>" & vbcrlf

                  else

                         response.write "</table><br /><table>" & vbcrlf

                  end if

                  currentClassname=rs("classname")

                  response.write "<tr><td align='center' style='font-weight:bold;'>"&currentClassname&"</td></tr>"& vbcrlf

           end if

           response.write "<tr><td><a href='test.asp?id="&rs("id")&"'>"&rs("title")&"</a></td></tr>"& vbcrlf

           rs.movenext

    loop

    response.write "</table>"& vbcrlf

    %>

    rs.close

    set rs=nothing

    conn.close

    set conn=nothing

     

    该方法要点有两个:

    1、  查询语句。

        我们看看这个查询语句:select id,classname,title from test order by classname,title

    红色字体部分就是要注意的,只有排序方式是先按类别排序的,我们才能得出我们需要的效果。

    2、  循环控制变量。

        从代码中,我们可以看到currentClassname这个变量记录了当前的类别名称,当该名称发生该表的时候,也就意味着上一类别已经输出完成,需要更改我们的显示了。

     

     

    (二)  通过ADOShape命令查询结果。

        我们先看看Shape命令在ADO中的说明:

        “数据构形定义了成形 Recordset 的列、由列代表的条目之间的关系以及数据充填到 Recordset 的方式。

    成形的 Recordset 可以由如下类型的列组成:

    列类型

    说明

    数据

    由对数据提供者、表或以前成形 Recordset 使用查询命令所返回的 Recordset 的字段。

    子集

    对另一个 Recordset 的引用,称为子集。子集列使定义-关系成为可能,在这种关系中是包含子集列的 Recordset是由子集代表的 Recordset

    合计

    列的值通过对所有行执行合计函数获得,或者是子 Recordset 的所有行的列。(请参阅下表中的合计函数。)

    计算表达式

    列的值通过对在 Recordset 的相同行中的列进行 Visual Basic for Applications 表达式的计算而获得。表达式是 CALC 函数的参数。(请参阅下表中的计算表达式。)

    新建

    空的、虚构的字段,可在随后充填数据。列使用 NEW 关键字定义。(请参阅下表中的 NEW 关键字。)

     

        Shape 命令可以包含子句,指定针对基本数据提供者并将返回 Recordset 对象的查询命令。查询的语法取决于对基本数据提供者的要求。虽然 ADO 并不要求使用任何指定的查询语言,但通常是使用结构化查询语言 (SQL)

        您可以使用 SQL JOIN 子句关联两个表,但是,分级 Recordset 可以更有效地表达信息。由 JOIN 创建的 Recordset 的每行会多余地重复一个表中的信息。分级 Recordset 的多个子 Recordset 对象中,每个对象仅有一个父 Recordset

    Shape 命令可以仅由 Recordset 对象发出。

        Shape 命令可以嵌套,即父命令或子命令本身可以是另一个 Shape 命令。

        有关定位分级 Recordset 的详细信息,请参阅访问分级 Recordset 中的行。

        有关语法正确的 Shape 命令的详细信息,请参阅形状语法格式。

    合计函数、CALC 函数和 NEW 关键字

        数据构形支持如下函数。chapter-alias 是指定给包含了将被操作列的子集名称。

        chapter-alias(子集-别名)可以是完整的,由指向包含 column-name 的子集的每个子集列名称组成,全部用句号分隔。例如,如果父子集 chap1 包含拥有数量列 amt 的子子集,则完整名即是 chap1.chap2.amt

    合计函数

    说明

    SUM(chapter-alias.column-name)

    计算指定列中所有值的和。

    AVG(chapter-alias.column-name)

    计算指定列中所有值的平均值。

    MAX(chapter-alias.column-name)

    计算指定列中的最大值。

    MIN(chapter-alias.column-name)

    计算指定列中的最小值。

    COUNT(chapter-alias[.column-name])

    计算指定别名或列中行的数量。

    STDEV(chapter-alias.column-name)

    计算指定列中的标准偏差。

    ANY(chapter-alias.column-name)

    列的值(列的值在所有行均相同)。

     

    计算表达式

    说明

    CALC(expression)

    计算任意表达式,但仅针对包含 CALC 函数的 Recordset 行。可以是任何 Visual Basic for Applications (VBA) 函数或表达式。

     

    NEW 关键字

    说明

    NEW (field type [(width | scale [,precision])]

    将指定类型的空列添加到 Recordset

     

        然后我们可以写出如下代码:

    <%@Language=VBScript  CodePage=936%>

    <%

    Option Explicit

    dim conn,rs,rschapClassname

    Set Conn=Server.CreateObject("ADODB.Connection")

    conn.Open "Provider=MSDataShape;Data Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:/projects/homepage/test/sample1/test.mdb;"

    set rs=conn.execute( "SHAPE  {select DISTINCT classname from test order by classname }" & vbcrlf & _

           "APPEND ({select id,title,classname from test} " & vbcrlf & _

           "RELATE classname TO classname) AS chapClassname")

    do while not rs.eof

           response.write "<table>" & vbcrlf & _

                  "<tr><td align='center' style='font-weight:bold;'>"&rs("classname")&"</td></tr>"& vbcrlf

           set rschapClassname=rs("chapClassname").value

           do while not rschapClassname.eof

                  response.write "<tr><td><a href='test.asp?id="&rschapClassname("id")&"'>"&rschapClassname("title")&"</a></td></tr>"& vbcrlf

                  rschapClassname.movenext

           loop

           response.write "</table>" & vbcrlf

           rs.movenext

    loop

    rschapClassname.close

    set rschapClassname=nothing

    rs.close

    set rs=nothing

    conn.close

    set conn=nothing

     

        在以上代码中我们要注意的有点:

    1、  数据库联接

        Shape命令构型一定要在数据库连接的字符串中加入Provider=MSDataShape;Data Provider=MSDASQL;,不然是不能用过shape进行查询的。

     

    2、  查询结构

       我们看看以下查询语句:

    SHAPE  {select DISTINCT classname from test order by classname }  

    APPEND ({select id,title,classname from test} RELATE classname TO classname) AS chapClassname

        首先是查询出主要类别:{select DISTINCT classname from test order by classname }

    然后通过APPEND将该类型的所有记录作为一个记录集追加到主查询,作为主查询的一个字段,然后通过      set rschapClassname=rs("chapClassname").value”访问该记录集进行输出。

     

     

        看过的朋友一定会问:“这两个方法哪个方法最好?”

        呵呵,不好意思,因为我没做过详细的测试,所以不知道那个最好。大家可以根据各自情况选择其中的一种办法,或许可能还有更好的办法是我没想到的。

     
  • 相关阅读:
    C#语法糖系列 —— 第二篇:聊聊 ref,in 修饰符底层玩法
    Excel 0x800AC472
    ArcGIS Pro 二次开发 一个问题搞了一天多
    C# 多线程的进度条
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: “object”未包括“get_Range”的定义
    ArcGIS Pro属性表中文乱码解决
    ArcGIS Pro二次开发有ID返回Feature
    ArcGIS Pro 二次开发=创建图层并将其添加到活动地图中。
    ArcGIS Pro所有的选项卡(Tab)和分组(group)
    ArcGIS Pro右键菜单
  • 原文地址:https://www.cnblogs.com/muyuge/p/6333872.html
Copyright © 2020-2023  润新知