以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  使用外部数据源时,动态加载数据的例子  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=2127)

--  作者:狐狸爸爸
--  发布时间:2009/3/17 0:03:00
--  使用外部数据源时,动态加载数据的例子
这是使用外部数据源进行动态加载的例子:

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


 

为测试方便,使用的是Aceess数据库作为数据源。

如果使用Sql Server,只需删除BeforeConnectOuterDataSource事件中的代码即可。


--  作者:gaoqr
--  发布时间:2009/3/17 7:19:00
--  
正需要,学习!
--  作者:t_fs
--  发布时间:2009/3/17 8:17:00
--  
     初学调用外部数据源,请问一下在BeforeLoadOuterTable事件中:

If e.DataTableName = "订单" Then
    e.SelectString = "Select * From 订单 Where 编号 < 0"
End If

     加载数据源的条件为什么是:Where 编号 < 0  。看表数据中并没有编号小于O的记录。难道在此仅仅是加裁空表,然后再目录树中再真正加裁数据吗?  

     请高人指点一二,谢谢了! 

--  作者:狐狸爸爸
--  发布时间:2009/3/17 9:15:00
--  
目录树也没有真正加载数据,因为目录树的Select语句用了Distinct关键词,这样只是获得不重复的产品和和户名称,这个数据量是极小的。
--  作者:gaoqr
--  发布时间:2009/3/17 11:13:00
--  
我本想把所有定额(25个表)放到外部数据中,没有成功。

数据加载为一条一条的加载(输入 定额编号 后,在所属 定额 中查找这个 定额编号 的 材料编号 和 定额用量 )

BeforeConnectOuterDataSource 如下:

If e.Name = "gaoqr"
  e.C & e.ProjectPath & "工程.mdb;Persist Security Info=False"
End If

BeforeLoadOuterTable 不会设置。(定额 是变量 25个表名,不知怎样改动)

If e.DataTableName = "实体预算书" Then
    e.SelectString = "Select * From 定额 Where 定额编号 < 0"
End If


请高人指点。

内部表原代码 DataColChanged 如下,通过。

                For Each dr2 As DataRow In DataTables(c("定额")).Select("定额编号 = \'" & c("定额编号") &  "\'")
                Dim r3 As Row = Tables(b("关联表")).AddNew
                r3("序号1") = c("序号1")
                r3("材料编号") = dr2("材料编号")
                r3("定额用量") = dr2("定额用量")
            Next

修改如下:
            Dim de As String = c("定额")
            Dim bh As String = c("定额编号")
            Dim cmd As New SQLCommand
            Dim dt As DataTable
            cmd.C
            cmd.CommandText = "SELECT DISTINCT 材料编号,定额用量 From de WHERE 定额编号 = bh "
            dt = cmd.ExecuteReader()
            For Each dr2 As DataRow In DataTables(dt)
                Dim r3 As Row = Tables(b("关联表")).AddNew
                r3("序号1") = c("序号1")
                r3("材料编号") = dr2("材料编号")
                r3("定额用量") = dr2("定额用量")
            Next

出现错误提示



图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

--  作者:狐狸爸爸
--  发布时间:2009/3/17 11:24:00
--  
哈哈,错误提示已经告诉你了啊:

For each dr2 as datarow in dt.DataRows
Next
--  作者:gaoqr
--  发布时间:2009/3/17 11:37:00
--  

这样修改也报错

            Dim bh As String = c("定额编号")
            Dim cmd As New SQLCommand
            Dim dt As DataTable
            cmd.CommandText = "SELECT * From de WHERE 定额编号 = bh "
            dt = cmd.ExecuteReader()
            For Each dr2 As DataRow In DataTables(dt).Select("定额编号 = bh ")

怎样修改正确?BeforeLoadOuterTable 应这样设置?

谢谢!


--  作者:狐狸爸爸
--  发布时间:2009/3/17 11:46:00
--  
以下是引用gaoqr在2009-3-17 11:37:00的发言:

这样修改也报错

            Dim bh As String = c("定额编号")
            Dim cmd As New SQLCommand
            Dim dt As DataTable
            cmd.CommandText = "SELECT * From de WHERE 定额编号 = bh "
            dt = cmd.ExecuteReader()
            For Each dr2 As DataRow In DataTables(dt).Select("定额编号 = bh ")

怎样修改正确?BeforeLoadOuterTable 应这样设置?

谢谢!


1、上面的代码和BeforeLoadOuterTable没有关系吧,报错得看错误提示,既然使用外部数据源,Cmd应该指定数据源名称,否则默认使用内部数据源,自然报错

2、如果所有的表,都不加载数据,BeforeLoadOuterTable的代码为:

e.SelectString = "Select * From "  & e.DataTableName  & "Where 1> 2"

如果是部分表:

select case e.DataTableName 
   case "表1","表2","表3"
      e.SelectString = "Select * From "   & e.DataTableName  & "Where 1> 2"
end select

3、一条一条加载,是低效做法,也容易带来其他问题,最好用Load和LoadFilter直接载入即可。
如果只是部分列,例如表4加载部分列,BeforeLoadOuterTable的代码为:

select case e.DataTableName 
   case "表1","表2","表3"
      e.SelectString = "Select * From "  &  e.DataTableName  & "Where 1> 2"
   case 
      e.SelectString = "Select 第一列,第二列,第三列 From 表 Where 1> 2"
end select

打开项目后,需要加载表4符合条件的数据:

DataTables("表4").LoadFilter = 条件表达式
DataTables("表4").Load

[此贴子已经被作者于2009-3-17 11:54:59编辑过]

--  作者:gaoqr
--  发布时间:2009/3/17 14:22:00
--  
先谢谢老大,我再试试。
--  作者:woodiy
--  发布时间:2009/6/3 14:56:00
--  
能否用文本框输入的方式动态加载呢?