Foxtable(狐表)用户栏目专家坐堂 → 出现了查询处理器用尽了堆栈空间的问题


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

主题:出现了查询处理器用尽了堆栈空间的问题

帅哥,在线噢!
yankunhao
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1033 积分:7258 威望:0 精华:0 注册:2008/9/1 22:34:00
出现了查询处理器用尽了堆栈空间的问题  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/10 17:38:00 [只看该作者]

IDS 太长了,不可以.

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

 回到顶部
帅哥,在线噢!
yankunhao
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1033 积分:7258 威望:0 精华:0 注册:2008/9/1 22:34:00
  发帖心情 Post By:2014/4/10 19:30:00 [只看该作者]

请问如果真的要一次过显示的话,有没办法?

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1033 积分:7258 威望:0 精华:0 注册:2008/9/1 22:34:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/11 8:58:00 [只看该作者]

应该是 SQL 加载条件语句不允许这么长.  你还是采取分页加载吧. 效率又高,何乐而不为

 回到顶部
帅哥,在线噢!
yankunhao
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1033 积分:7258 威望:0 精华:0 注册:2008/9/1 22:34:00
  发帖心情 Post By: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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/4/11 9:10:00 [只看该作者]

子父表需要同步加载,具体可以参考帮助的动态加载 已经分页加载的章节.

先去啃一下帮助吧.

 回到顶部
帅哥,在线噢!
狐狸爸爸
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/4/11 9:27:00 [只看该作者]

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

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

 

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


 回到顶部
帅哥,在线噢!
狐狸爸爸
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/4/11 9:34:00 [只看该作者]

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

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

 


 回到顶部
总数 12 1 2 下一页