以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  SQL外部数据源进行模糊查找?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=4854)

--  作者:woodiy
--  发布时间:2009/11/2 19:39:00
--  SQL外部数据源进行模糊查找?

图片点击可在新窗口打开查看此主题相关图片如下:qq截图未命名.png
图片点击可在新窗口打开查看

说明:整个出库主表与出库明细均为SQL外部数据源
      打开窗口时动态加前TOP 100

窗口中的表格为TABLE副本,如何进行如上图所示的模糊查找?(要求在整个外部数据库中查找)


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试项目.table

[此贴子已经被作者于2009-11-2 19:40:26编辑过]

--  作者:lxl
--  发布时间:2009/11/2 23:42:00
--  

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


--  作者:blackzhu
--  发布时间:2009/11/3 8:03:00
--  

    
        Dim dst As Table = Tables("某表")
        Dim txb1 As WinForm.TextBox = .Controls("TextBox1")
        Tables("窗口中的Table").Filter = "[列名1] Like \'*" & txb1.text & "*\' or [列名2] Like \'*" & txb1.text & "*\'"    

    放在textbox的文本值改变的事件中.列名自己加.
       
      

--  作者:blackzhu
--  发布时间:2009/11/3 8:12:00
--  
 上面的代码只能用于已加载的数据,对于你这个还可以利用动态加载的方法查询.
--  作者:woodiy
--  发布时间:2009/11/3 9:22:00
--  
以下是引用lxl在2009-11-2 23:42:00的发言:

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

文件可以打开,请重试


--  作者:woodiy
--  发布时间:2009/11/3 9:24:00
--  
以下是引用blackzhu在2009-11-3 8:12:00的发言:
 上面的代码只能用于已加载的数据,对于你这个还可以利用动态加载的方法查询.

对,我就需要动态加载的查询,代码是怎么样的,有例子吗?


--  作者:lxl
--  发布时间: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编辑过]