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 |
上一页 |
If
Page > 1
Then |
下一页 |
If
Page <
Functions.Execute("Pages")
Then |
最末页 |
Dim
pg As
Integer =
Functions.Execute("Pages") |