set rs=cn.execute(str) rs.movelast,rs.moveprevious

解决方案 »

  1.   

    用set rs=cn.execute(str)方式打开的游标是仅向前类型的,不能moveprevious;把程序改为:
    set rs=new adodb.recordset
    rs.Open str, cn, adOpenKeyset, adLockReadOnly, adCmdText
      

  2.   

    Recordset 对象
                Recordset 对象表示的是来自基本表或命令执行结果的记录全集。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录。说明可使用 Recordset 对象操作来自提供者的数据。使用 ADO 时,通过 Recordset 对象可对几乎所有数据进行操作。所有 Recordset 对象均使用记录(行)和字段(列)进行构造。由于提供者所支持的功能不同,某些 Recordset 方法或属性有可能无效。ADOR.Recordset 和 ADODB.Recordset 是用来创建 Recordset 对象的 ProgID。由此产生的 Recordset 对象行为相同,与 ProgID 无关。ADOR.Recordset 随 Microsoft® Internet Explorer 安装,而 ADODB.Recordset 则随 ADO 安装。Recordset 对象的行为受环境(即客户端、服务器、Internet Explorer 等)的影响。这些差异将在属性、方法和事件的“帮助”主题中加以说明。在 ADO 中定义了四种不同的游标类型: 动态游标 — 用于查看其他用户所作的添加、更改和删除,并用于不依赖书签的 Recordset 中各种类型的移动。如果提供者支持,可使用书签。
    键集游标 — 其行为类似动态游标,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所作的数据更改将依然可见。它始终支持书签,因此允许 Recordset 中各种类型的移动。
    静态游标 — 提供记录集合的静态副本以查找数据或生成报告。它始终支持书签,因此允许 Recordset 中各种类型的移动。其他用户所作的添加、更改或删除将不可见。这是打开客户端 (ADOR) Recordset 对象时唯一允许使用的游标类型。
    仅向前游标 — 除仅允许在记录中向前滚动之外,其行为类似静态游标。这样,当需要在 Recordset 中单程移动时就可提高性能。 
    在打开 Recordset 之前设置 CursorType 属性来选择游标类型,或使用 Open 方法传递 CursorType 参数。部分提供者不支持所有游标类型。请检查提供者的文档。如果没有指定游标类型,ADO 将默认打开仅向前游标。如果 CursorLocation 属性被设置为 adUseClient 后打开 Recordset,则在返回的 Recordset 对象中,Field 对象的 UnderlyingValue 属性不可用。对部分提供者(例如 Microsoft ODBC Provider for OLE DB 连同 Microsoft SQL Server),可以通过使用 Open 方法传递连接字符串,根据以前定义的 Connection 对象独立地创建 Recordset 对象。ADO 仍然创建 Connection 对象,但它不将该对象赋给对象变量。不过,如果正在相同的连接上打开多个 Recordset 对象,就应该显式创建和打开 Connection 对象,由此将 Connection 对象赋给对象变量。如果在打开 Recordset 对象时没有使用该对象变量,即使在传递相同连接字符串的情况下,ADO 也将为每个新的 Recordset 创建新的 Connection 对象。可以创建所需数量的 Recordset 对象。打开 Recordset 时,当前记录位于第一个记录(如果有),并且 BOF 和 EOF 属性被设置为 False。如果没有记录,BOF 和 EOF 属性设置是 True。假设提供者支持相关的功能,可以使用 MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法以及 Move 方法,和 AbsolutePosition、AbsolutePage 和 Filter 属性来重新确定当前记录的位置。仅向前 Recordset 对象只支持 MoveNext 方法。当使用 Move 方法访问每个记录(或枚举 Recordset)时,可使用 BOF 和 EOF 属性查看是否移动已经超过了 Recordset 的开始或结尾。Recordset 对象可支持两类更新:立即更新和批更新。使用立即更新,一旦调用 Update 方法,对数据的所有更改将被立即写入基本数据源。也可以使用 AddNew 和 Update 方法将值的数组作为参数传递,同时更新记录的若干字段。如果提供者支持批更新,可以使提供者将多个记录的更改存入缓存,然后使用 UpdateBatch 方法在单个调用中将它们传送给数据库。这种情况应用于使用 AddNew、Update 和 Delete 方法所做的更改。调用 UpdateBatch 方法后,可以使用 Status 属性检查任何数据冲突并加以解决。注意   要执行不使用 Command 对象的查询,应将查询字符串传递给 Recordset 对象的 Open 方法。但是,在想要保持命令文本并重复执行或使用查询参数时,仍然需要 Command 对象。
      

  3.   

    CreateRecordset 方法 (RDS)
          创建未连接的空记录集。语法object.CreateRecordset(ColumnInfos)参数Object   对象变量,代表 RDSServer.DataFactory 或 RDS.DataControl 对象。ColumnsInfos   数组的变体型数组,用于定义所创建的 Recordset 的每列。每列的定义都包含具有以下四个所需属性的数组。属性 说明 
    Name 列标头的名称。 
    Type 整型数据类型。 
    Size 以字符为单位的整型宽度,与数据类型无关。 
    Nullability 布尔值。 
    随后列数组的集合被组合为一个数组,用以定义 Recordset。说明服务器端业务对象可以使用来自非 OLE DB 数据提供者的数据充填所产生的 ADODB.Recordset,例如包含股票份额的操作系统文件。下表列出了 RDSServer.DataFactory 对象的 CreateRecordset 方法支持的数据类型,所列编号为用于定义字段的引用编号。每种数据类型可以是固定长度或可变长度。固定长度类型的大小应定义为 -1,因为其大小已预先确定而此处仍需要其大小的定义。可变长度数据类型大小的允许范围从 1 到 32767。对于某些可变数据类型,其类型可以强制为在“替换”列中注明的类型。只有在创建和填写 Recordset 之后才能看到替换情况,此后如有必要,可以检查实际数据类型。长度 常量 编号 替换 
    固定 adTinyInt 16  
    固定 adSmallInt 2  
    固定 adInteger 3  
    固定 adBigInt 20  
    固定 adUnsignedTinyInt 17  
    固定 adUnsignedSmallInt 18  
    固定 adUnsignedInt 19  
    固定 adUnsignedBigInt 21  
    固定 adSingle 4  
    固定 adDouble 5  
    固定 adCurrency 6  
    固定 adDecimal 14  
    固定 adNumeric 131  
    固定 adBoolean 11  
    固定 adError 10  
    固定 adGuid 72  
    固定 adDate 7  
    固定 adDBDate 133  
    固定 adDBTime 134  
    固定 adDBTimestamp 135 7 
    可变 adBSTR 8 130 
    可变 adChar 129 200 
    可变 adVarChar 200  
    可变 adLongVarChar 201 200 
    可变 adWChar 130  
    可变 adVarWChar 202 130 
    可变 adLongVarWChar 203 130 
    可变 adBinary 128  
    可变 adVarBinary 204  
    可变 adLongVarBinary 205 204 
      

  4.   

    Recordset 和 SourceRecordset 属性范例
    该范例演示如何在运行时设置 RDSServer.DataFactory 默认业务对象所必需的参数。要测试该范例,请剪切代码并粘贴到标准 HTML 文档的 <Body></Body> 标记之间,然后将其命名为“ADCapi4.asp”。ASP 脚本将标识服务器。<Center><H2>RDS API Code Examples</H2>
    <HR>
    <H3>Using SourceRecordset and Recordset with RDSServer.DataFactory</H3>
    <!-- RDS.DataSpace ID ADS1 -->
    <OBJECT ID="ADS1" WIDTH=1 HEIGHT=1
    CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
    </OBJECT><!--参数在运行时设置的 RDS.DataControl -->
    <OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
       ID=ADC>
    </OBJECT><Object CLASSID="clsid:AC05DC80-7DF1-11d0-839E-00A024A94B3A"
       CODEBASE="http://<%=Request.ServerVariables("SERVER_NAME")%>/MSADC/Samples/Sheridan.cab"
       ID=GRID1 
          datasrc=#ADC
          HEIGHT=125 
          WIDTH=495>
       <PARAM NAME="AllowAddNew" VALUE="TRUE">
       <PARAM NAME="AllowDelete" VALUE="TRUE">
       <PARAM NAME="AllowUpdate" VALUE="TRUE">
       <PARAM NAME="Caption" VALUE="RDSServer.DataFactory Run Time">
    </OBJECT>
    <HR>
    <Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
    <Input Size=70 Name="txtConnect" Value="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"><BR>
    <Input Size=70 Name="txtSQL" Value="Select * from Employee">
    <HR>
    <INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
    <H4>Fill Grid with these values or change them to see data from another ODBC data source on your server.
    <BR>Try dsn=pubs;uid=sa;pwd=; and Select * From Authors</H4>
    </Center>
    <Script Language="VBScript">
    <!--
    Dim ADF
    Dim strServer
    strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"Sub Run_OnClick()
       Dim objADORs         ' 创建 RDSServer.DataFactory 对象。
    Set ADF = ADS1.CreateObject("RDSServer.DataFactory", strServer)               ' Get Recordset
    Set objADORs = ADF.Query(txtConnect.Value,txtSQL.Value)' 在运行时设置 RDS.DataControl 的参数。
       ADC.Server = txtServer.Value
       ADC.SQL = txtSQL.Value
       ADC.Connect = txtConnect.Value
       ADC.Refresh
    End Sub
    -->
    </Script>