Foxtable(狐表)用户栏目专家坐堂 → SQL外部数据源进行模糊查找?


  共有15091人关注过本帖树形打印复制链接

主题:SQL外部数据源进行模糊查找?

帅哥哟,离线,有人找我吗?
lxl
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2009/11/2 23:42:00 [显示全部帖子]

文件点了半天没打开。
SQL SERVER 数据源用
WHERE 字段 like '%关键字%' 


 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2009/11/3 9:52:00 [显示全部帖子]

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编辑过]

 回到顶部