以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  出现了查询处理器用尽了堆栈空间的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=49018)

--  作者:yankunhao
--  发布时间:2014/4/10 17:30:00
--  出现了查询处理器用尽了堆栈空间的问题

我在一个"obas_part1"表的AfterLoad事件中写有如下代码:

 

DataTables("obas_part1").DataRows.Count > 0 Then
    Dim ids As String
    For Each dr As DataRow In DataTables("obas_part1").DataRows
        ids = ids & ",\'" & dr("part_no") & "\'"
    Next
    ids = ids.Trim(",")   
    Dim s As String = "{obas_part1}.[part_no] In (" & ids & ")"
    DataTables("半成品查询表").LoadFilter = s
    DataTables("半成品查询表").Load()
End If

 

现在"obas_part1"表当加载行约9000多行时会提示如下错误信息,请问是什么问题?应该如何做呢?

 

.NET Framework 版本:2.0.50727.3655If
Foxtable 版本:2014.3.8.1
错误所在事件:加载[半成品查询表]失败!
详细错误信息:
内部查询处理器错误: 在查询优化过程中,查询处理器用尽了堆栈空间。


--  作者:Bin
--  发布时间:2014/4/10 17:38:00
--  
IDS 太长了,不可以.

9000多条,这不科学.你分页加载吧

--  作者:yankunhao
--  发布时间:2014/4/10 19:30:00
--  
请问如果真的要一次过显示的话,有没办法?
--  作者:有点甜
--  发布时间:2014/4/10 20:37:00
--  
以下是引用yankunhao在2014-4-10 19:30:00的发言:
请问如果真的要一次过显示的话,有没办法?

 

既然你的代码写在afterload事件里,那完全可以这样写代码吧?

 

Dim filter As String = DataTables("obas_part1").LoadFilter

DataTables("半成品查询表").LoadFilter = "主键 in (select 主键 from {父表} where " & IIF(filter>"",filter,"1=1") & ")"
--  作者:yankunhao
--  发布时间:2014/4/11 8:55:00
--  
以下是引用有点甜在2014-4-10 20:37:00的发言:

 

既然你的代码写在afterload事件里,那完全可以这样写代码吧?

 

Dim filter As String = DataTables("obas_part1").LoadFilter

DataTables("半成品查询表").LoadFilter = "主键 in (select 主键 from {父表} where " & IIF(filter>"",filter,"1=1") & ")"

谢谢你的方法,不过经过测试,你的这个方法还是一样的错误提示!

 

我现在用以下的代码,就没出错提示,那是不是说明如果 ids 超过来String字符串类的最大长度,才会提示出错,从我的测试来看一次加载9000多行数据是可行的,问题是我想知道是不是ids变量超过来String字符串类的最大长度,还是LoadFilter不能太长(最多为多少?)那String字符串类的最大长度是多少?(

但说明里不是说:

String

任意个数的字符,常称为字符串。

)有没一个更科学的判断办法?

 

Select Case DataTables("obas_part1").DataRows.Count
    Case 0 To 5000
        Dim ids As String
        For Each dr As DataRow In DataTables("obas_part1").DataRows
            ids = ids & ",\'" & dr("part_no") & "\'"
        Next
        ids = ids.Trim(",")
        Dim s As String = "{obas_part1}.[part_no] In (" & ids & ")"
        DataTables("半成品查询表").LoadFilter = s
        DataTables("半成品查询表").Load()
    Case > 5000
        DataTables("半成品查询表").LoadFilter = "{obas_part}.item_no Like \'2%\'"
        DataTables("半成品查询表").Load()    
End Select

 

[此贴子已经被作者于2014-4-11 8:59:09编辑过]

--  作者:Bin
--  发布时间:2014/4/11 8:58:00
--  
应该是 SQL 加载条件语句不允许这么长.  你还是采取分页加载吧. 效率又高,何乐而不为
--  作者:yankunhao
--  发布时间:2014/4/11 9:09:00
--  
以下是引用Bin在2014-4-11 8:58:00的发言:
应该是 SQL 加载条件语句不允许这么长.  你还是采取分页加载吧. 效率又高,何乐而不为

 

分页加载如何写呢?因为我是两个表的加载,先加载的为子表,后加载的为父表,就是说父表是用户看不见的,用户只是看到子表,而了表的一些字段是用表达式的,表达式是引用父表的数据,所以当用户需要查子表时,他会根据我给的加载树,选择加载子表的数据,当加载完子表数据时,再去由程序根据条件加载父表的数据。

 

这是加载树窗口

AfterLoad代码:

 

Dim cmd As New SQLCommand
    cmd.C
    Dim dt As DataTable
       cmd.CommandText = "Select Distinct  {obas_part1}.[part_type],[part_name],[type_name] From ({obas_part1} Inner JOIN {obas_part} ON {obas_part}.[part_no] = {obas_part1}. [part_no]) Inner JOIN {obas_part_type} ON {obas_part_type}.[type_no] = {obas_part1}.[part_type] Where {obas_part1}.[part_type] Like \'2%\' Order By  {obas_part1}.[part_type]"
    dt = cmd.ExecuteReader()
    Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
       trv.BuildTree(dt,"type_name|part_name","","type_name")
    trv.Nodes.Insert("加载所有数据",0)

 

 

这是加载树的

AfterCheckNode 代码:

 

Dim trv As WinForm.TreeView = e.Sender
Dim flt As String
Dim flt1 As String
For Each nd As WinForm.TreeNode In e.node.Nodes \'同步子节点选中状态
    nd.Checked = e.Node.Checked
Next
If e.node.ParentNode IsNot Nothing Then \'去掉父节点选中状态
    e.node.ParentNode.Checked = False
End If

For Each nd As WinForm.TreeNode In trv.AllNodes
    If nd.Checked Then
        If nd.Text = "加载所有数据" Then
            flt = "{obas_part1}.[part_type] Like \'2%\'"
        End If
        If flt > "" Then
            flt = flt & " Or "  \'注意用or而不是And
        End If
       
       
        If nd.Level = 0 Then \'注意下面的条件都要用括号括起来
           
            flt = flt & "( type_name = \'" & nd.Text & "\')"
        Else
            flt = flt & "( type_name = \'" & nd.ParentNode.Text & "\' And part_name = \'" & nd.Text & "\')"
        End If
    End If
Next

If flt = "" Then
    flt = "{obas_part}.[part_no] Is null"
ElseIf flt = "{obas_part1}.[part_type] Like \'2%\' Or ( type_name = \'加载所有数据\')" Then
    flt = "{obas_part1}.[part_type] Like \'2%\'"
   
End If


Dim ids As String

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "Select {obas_part1}.part_no From ({obas_part1} Inner JOIN {obas_part} ON {obas_part}.[part_no] = {obas_part1}. [part_no]) Inner JOIN {obas_part_type} ON {obas_part_type}.[type_no] = {obas_part1}.[part_type] Where " & flt
dt = cmd.ExecuteReader()

If dt.DataRows.Count > 0
    For Each dr As DataRow In dt.DataRows
        ids = ids & ",\'" & dr("part_no") & "\'"
    Next
    ids = ids.Trim(",")
   
    DataTables("obas_part1").LoadFilter = "part_no In (" & ids & ")"
    DataTables("obas_part1").Load()
End If

 


[此贴子已经被作者于2014-4-11 9:09:33编辑过]

--  作者:Bin
--  发布时间:2014/4/11 9:10:00
--  
子父表需要同步加载,具体可以参考帮助的动态加载 已经分页加载的章节.

先去啃一下帮助吧.

--  作者:狐狸爸爸
--  发布时间:2014/4/11 9:27:00
--  

这里有自己设计分页加载树的说明:

http://www.foxtable.com/help/topics/2692.htm

 

参考着调整一下你的代码即可。


--  作者:狐狸爸爸
--  发布时间:2014/4/11 9:34:00
--  

还有,不想分页的话,换个方法加载子表数据:

http://www.foxtable.com/help/topics/2894.htm