本帖最后由 yhxhappy 于 2018-4-13 12:32 编辑
我有类似的方案,不是通过下拉滚动条,而是通过翻页的方式
当数据库中有很多行,没办法一次读取,太费时。
默认先返回前 100 (1-100)行显示在 LV
当用户点击下一页时,清空 LV,再从数据库读取 101-200 行显示在 LV,以此类推
下图是微软的一个工具,原理类似:
原理是:
首先要先知道 数据库 表总共有几行,除以 LV显示行数(假设100) 得出 页数
假如当前页是8,当点击 下一页 按钮时,读取“表” (8+1)*100 = 900~1000行的数据
以下是我目前正在使用的,用于MSSQL,因为主键不是连续的,所以有点复杂。如果你的表ID列是连续的要简单很多,使用我注释掉的两行查询。
$Field 字段,也可以用 *
$Condition WHERE条件
$StartIndex 开始的行索引,比如从第200行开始读取,$StartIndex = 200
$ItemNum 要获取多少行Func _MsSQL_GetNumberOfRows2($Obj, $Table, $Field, $Condition, $StartIndex, $ItemNum) ;返回 表中指定数量的 行
If Not IsObj($Obj) Then
SetError(1)
Return 0
ElseIf $Table = "" Or $StartIndex = "" Or $ItemNum = "" Or $Field = "" Then
SetError(2)
Return 0
EndIf
;$ItemNum -= 1
$FieldNum = _MsSQL_GetColumnNum($Obj, $Table) ;取得列的数量
If @error Or $FieldNum = 0 Then
SetError(3)
Return 0
EndIf
$RowNum = _MsSQL_GetRowNum($Obj, $Table, $Condition)
If $RowNum = 0 Then ;取得行数量,如果为0则退出
SetError(4)
Return 0
EndIf
;MsgBox(0,0,$RowNum)
If $StartIndex > $RowNum Then ;如果起始索引大于总行数,则起始索引等于最后一行
$StartIndex = $RowNum
$ItemNum = 0
ElseIf $StartIndex <= 0 Then
$StartIndex = 1
EndIf
If $StartIndex+$ItemNum-1 > $RowNum Then ;如果开始位数+项目数量,大于总数量,则只能取到最后一个
$ItemNum = $RowNum-$StartIndex+1
EndIf
If $ItemNum <= 0 Then $ItemNum = 1 ;不能小于0
$WHERE = ""
If $Condition <> "" Then $WHERE = " WHERE " & $Condition
$RS = ObjCreate("ADODB.Recordset")
$RS.ActiveConnection = $Obj
;SELECT TOP 100 FROM (SELECT TOP 300 FROM SN_Key ORDER BY ID DESC) AS WK ORDER BY ID ASC
;select top 10 * from (select top 30 * from tablename order by id asc) A order by id desc
ConsoleWrite("SELECT TOP " & $ItemNum & " * FROM (SELECT TOP " & $StartIndex+$ItemNum-1 & " * FROM "& $Table & $WHERE & " ORDER BY " & $Field & " DESC) A ORDER BY " & $Field & " ASC" & @CRLF)
$RS.Open("SELECT TOP " & $ItemNum & " * FROM (SELECT TOP " & $StartIndex+$ItemNum-1 & " * FROM " & $Table & $WHERE & " ORDER BY " & $Field & " DESC) A ORDER BY " & $Field & " ASC")
Local $Num = 0, $Array[1][$FieldNum] = [[0, 0]], $text = ""
While Not $RS.eof And Not $RS.bof
; If @error Then ExitLoop
For $i = 0 To $FieldNum-1 ;循环读取字段值
$Text &= $RS.Fields($i).value & "|"
Next
_ArrayAdd($Array, StringTrimRight($Text, 1)) ;通常会多加一个|,会导致数组维数不对,删除最后一个 |
$text = ""
$Num += 1
;ToolTip($Num)
$RS.movenext;下一笔资料
WEnd
$RS.close
If $Num = 0 Then
SetError(5)
Return 0
Else
$Array[0][0] = $Num
$Array[0][1] = $RowNum
Return $Array
EndIf
EndFunc ;==>_Query
|