ExecuteReader示例
我们知道SQLCommand的ExecuteReader方法用于生成一个临时的DataTable。
我们知道动态生成查询的时候用QueryBuilder。
动态生成外部表的时候用OuterTableBuilder。
而GroupTableBuilder和CrossTableBuilder也可以直接统计后台数据,只需将其FromServer属性设为True即可。
那么SQLCommand提供的ExecuteReader方法,会有实际的用途吗?
一般来说,如果没有动态加载数据,而是一次性将所有数据加载到DataTable中,那么ExecuteReader确实没有什么用。
如果采用动态加载数据,那么数据表中的数据就不完整,此时ExecuteReader就派上用场了。
示例一
本示例可以参考CaseStudy目录下的文件“动态加载演示.Table”
假定你有一个订单表,也许有几百个产品,上十万个订单,那么将其全部载入到Foxtable中是不现实的。
能不能用一个目录树列出所有的产品和客户,当我们双击某个产品或客户时,才加载对应的订单呢?
实现这样的功能,其实很简单:
1、首先我们参考大容量数据的管理,使得打开项目的时候,订单表不会加载任何数据。
2、然后新建一个窗口,窗口中插入一个目录树(TreeView),窗口的AfterLod事件代码设为:
Dim
cmd As New SQLCommand
Dim dt As DataTable
cmd.CommandText = "SELECT DISTINCT 产品,客户 From {订单}"
dt = cmd.ExecuteReader()
Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv.BuildDataTree(dt, "","产品", "客户")
这样一旦打开窗口,该目录树列出所有的产品和客户。
由于订单表只是加载了部分数据,所以我们不能直接根据订单表来生成目录树,因为订单表的数据不完整,只能用ExecuteReader方法直接从后台提取完整的产品和客户数据。
注意Select语句中,一定要有DISTINCT关键词,这样返回的才是不重复的产品和客户名单,虽然对目录树的生成没有影响,但是会大大降低数据加载量,对于网络环境,这是非常重要的。
3、最后将目录树的NodeMouseDoubleClick事件设为:
Dim
Value()As String
Dim Filter As string
Value = e.Node.FullPath.Split("\")
Select Case e.Node.Level
Case 0
Filter ="[产品] = '" & Value(0) & "'"
Case 1
Filter ="[产品] = '" & Value(0) & "' And [客户] = '" & Value(1) & "'"
End Select
DataTables("订单").LoadFilter = Filter
DataTables("订单").Load()
这样我们只需双击某个节点,既可动态加载对应的订单。
此主题相关图片如下:无标题.jpg
CasteStudy目录下还提供了外部数据源动态加载数据的例子,文件名为:动态加载数据(外部数据源).Table
为便于大家测试学习,使用了Access作为外部数据源,如果采用SQL Server,请修改或删除项目事件BeforeConnectOuterDataSource中的代码。
示例二
同样,假定窗口中有一个组合框(ComboBox),希望这个窗口能够列出订单表所有的客户名称,如果订单表采用动态加载,那么显然无法从订单表中获得所有客户名称,只能利用ExecuteReader直接从后台提取:
Dim
cmd As New SQLCommand
Dim dt As DataTable
Dim cmb As WinForm.ComboBox
cmd.CommandText = "SELECT DISTINCT 客户 From {订单}"
dt = cmd.ExecuteReader()
cmb = e.Form.Controls("ComboBox1")
cmb.ComboList= dt.GetComboListString("客户")
上述代码可以设置在窗口的AfterLoad事件中。
示例三
QueryBuilder会生成一个Table,用于显示查询结果。
有的时候你可能希望不是以Table形式,而是以DataList的形式在窗口显示查询结果,可以参考:
Dim
cmd As New SQLCommand
Dim dt As DataTable
cmd.CommandText = "SELECT * From {订单} Where 产品 = 'PD01'"
dt = cmd.ExecuteReader()
Dim dst As WinForm.DataList = e.Form.Controls("DataList1")
dst.DataTable = dt
dst.Build()自己试试:)
[此贴子已经被作者于2009-11-3 9:57:55编辑过]