SQLLoad

本节内容适合熟练掌握SQL语句的用户。

Foxtable提供的动态加载和分页加载,使用简单,能胜任绝大多数场合的需求。
但是也有局限,因为Load方法需要拆解现有Select语句,然后根据LoadFilter等属性的设置,重新合成Select语句,在面对复杂的Select语句的时候,这种拆解和合成可能会失败,导致数据加载失败。

为解决这个问题,Foxtable专门提供了一个SQLLoad,该方法允许用户自行编写Select语句加载数据。

使用SQLLoad方法有两个原则:

1、新的Select语句不能改变表的原有结构。
2、新的Select语句也必须从相同的后台表中提取数据。

如果表是数据表,那么必须遵循上述两个原则,如果表是查询表,只需遵循第一个原则即可。

示例

我们知道SQL Server从2005开始,提供了一个ROW_NUMBER函数, 用于返回行号,通过这个函数,可以非常方便地实现分页加载。

下面我们用一个具体的例子,讲述一下如何基于这个函数来实现分页加载,假定每页50行:

1、增加一个查询表,其Select语句为:

Select * From (Select Row_Number() Over(Order by [订单ID]) As RowNum, * from 订单) As a Where RowNum >= 1 And RowNum <= 50

默认加载前50行数据,也就是第一页。

2、在全局代码中定义一个Public变量,用于记录当前页号:

Public Page As Integer = 1

3、增加一个自定义函数,函数名为LoadData,用于加载当前页数据:

 Dim r1 As Integer = (Page - 1) * 50 + 1
 Dim
r2 As Integer = Page * 50
 Dim
sql As String
 sql
= "Select * From (Select Row_Number() Over(Order by [订单ID]) As RowNum, * from 订单) As a "
 sql
= sql & " Where RowNum >= " & r1 & " And RowNum <= " & r2
 DataTables
(
"
订单").SQLLoad(sql)

4、再增加一个自定义函数,名为Pages,用于计算总的页数:

Dim cmd As New SQLCommand
Dim
cnt As Integer
cmd
.ConnectionName = "数据源名称"
cmd
.CommandText = "Select Count(*) From {订单}"
cnt = cmd.ExecuteScalar

Return
Math.Ceiling(cnt / 50) '计算总的页数,每页50行

3、在窗口或者菜单中,加上四个按钮,按钮的Click事件代码分别设置为:

按钮 代码
第一页

Page = 1
Functions
.Execute("LoadData")

上一页

If Page > 1 Then
    Page = Page - 1
   
Functions.Execute("LoadData")
End
If

下一页

If Page < Functions.Execute("Pages") Then
    Page = Page + 1
    Functions.Execute("LoadData")

End
If

最末页

Dim pg As Integer = Functions.Execute("Pages")
If
Page <> pg Then
    Page = pg
   
Functions.Execute("LoadData")
End
If


本页地址:http://www.foxtable.com/webhelp/topics/2721.htm