Foxtable(狐表)用户栏目专家坐堂 → 奇怪的程序假死问题


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

主题:奇怪的程序假死问题

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


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
奇怪的程序假死问题  发帖心情 Post By:2013/8/4 18:43:00 [显示全部帖子]

普通代码:

If khddcx = "" Then
    MessageBox.show("请输入!","提示")
    Return
Else
    DataTables("供应商资料主表").LoadFilter = "名称 Like '%" & khddcx & "%' or 代码 Like '%" & khddcx & "%'"
    DataTables("供应商资料主表").Load()
    DataTables("供应商资料子表").LoadFilter = "联系人 Like '%" & khddcx & "%'"
    DataTables("供应商资料子表").Load()
    If DataTables("供应商资料主表").DataRows.Count = 0  AndAlso DataTables("供应商资料子表").DataRows.Count = 0  Then
        MessageBox.show("没有查找到相关供应商资料!","提示")
        Return
    Else
        Dim ids As String
        For Each dr As DataRow In DataTables("供应商资料主表").DataRows
            ids = ids & ",'" & dr("代码") & "'"
            ids= ids.Trim(",")
            DataTables("供应商资料子表").LoadFilter = "代码 In (" & ids & ")"
        Next
        Dim vds As String
        For Each dr As DataRow In DataTables("供应商资料子表").DataRows
            vds = vds & ",'" & dr("代码") & "'"
            vds= vds.Trim(",")
            DataTables("供应商资料主表").LoadFilter = "代码 In (" & vds & ")"
        Next
    End If
End If
DataTables("供应商资料子表").LoadTop = ""
DataTables("供应商资料子表").Load()

改造过的内部函数:

Dim cx As String = Args(0)
Dim mgs As String = Args(1)
Dim tbn As String =Args(2)
Dim tbn1 As String =Args(3)
Dim key As String = Args(4)
Dim key1 As String = Args(5)
Dim key2 As String =Args(6)
Dim keys As String =Args(7)
If cx = "" Then
    MessageBox.show(mgs,"提示")
    Return Nothing
Else
    DataTables(tbn).LoadFilter = key & " Like '%" & cx & "%' or " & key1 & " Like '%" & cx & "%'"
    DataTables(tbn).Load()
    DataTables(tbn1).LoadFilter = key2 & " Like '%" & cx & "%'"
    DataTables(tbn1).Load()
    If DataTables(tbn).DataRows.Count = 0 AndAlso DataTables(tbn1).DataRows.Count = 0 Then
        MessageBox.show("没有查找到相关数据!","提示")
        Return Nothing
    Else
        Dim ids As String
        For Each dr As DataRow In DataTables(tbn).DataRows
            ids = ids & ",'" & dr(keys) & "'"
            ids= ids.Trim(",")
            DataTables(tbn1).LoadFilter = keys & "In (" & ids & ")"
        Next
        Dim vds As String
        For Each dr As DataRow In DataTables(tbn1).DataRows
            vds = vds & ",'" & dr(keys) & "'"
            vds= vds.Trim(",")
            DataTables(tbn).LoadFilter = keys & "In (" & vds & ")"
        Next
    End If
End If
DataTables(tbn1).LoadTop = ""
'DataTables(tbn1).Load()

 

执行函数代码:Functions.Execute("主子表查询",e.Form.Controls("查询框(供应商信息)").Text,"请输入供应商名称或供应商代码或联系人!","供应商资料主表","供应商资料子表","名称","代码","联系人","代码")

 

内部函数代码最后一句标红加粗的去掉就没事,但是子表没有被加载,无法显示,执行的话就直接导致程序假死,求大神解答

 

 


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


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 18:53:00 [显示全部帖子]

以下是引用lsy在2013-8-4 18:52:00的发言:

If DataTables("供应商资料主表").DataRows.Count = 0  AndAlso DataTables("供应商资料子表").DataRows.Count = 0  Then

 

Orelse ?

这里必须用AndAlso的,因为我要两个条件都满足


 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 18:55:00 [显示全部帖子]

这个是tbn1加载引起的问题,会导致我的程序死掉,动不了

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


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 19:03:00 [显示全部帖子]

以下是引用lsy在2013-8-4 19:01:00的发言:

你判断两个条件。

一个条件不满足的话,结果会怎样?

你看我正常的代码,那段代码可以正确无错的执行的,我测试过很多次了


 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 19:05:00 [显示全部帖子]

判断这里不会有问题的,因为我的查询是主子表一起查询的,可以查询主表列的关键字,也可以查询子表列的关键字的

 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 19:13:00 [显示全部帖子]

以下是引用jspta在2013-8-4 19:06:00的发言:

没看懂了,

 If DataTables(tbn).DataRows.Count = 0 AndAlso DataTables(tbn1).DataRows.Count = 0 Then
        MessageBox.show("没有查找到相关数据!","提示")
        Return Nothing
    Else
        Dim ids As String
        For Each dr As DataRow In DataTables(tbn).DataRows
            ids = ids & ",'" & dr(keys) & "'"
            ids= ids.Trim(",")
            DataTables(tbn1).LoadFilter = keys & "In (" & ids & ")"
        Next
        Dim vds As String
        For Each dr As DataRow In DataTables(tbn1).DataRows
            vds = vds & ",'" & dr(keys) & "'"
            vds= vds.Trim(",")
            DataTables(tbn).LoadFilter = keys & "In (" & vds & ")"
        Next
    End If
这两段代码干什么的?这个和

    DataTables(tbn).LoadFilter = key & " Like '%" & cx & "%' or " & key1 & " Like '%" & cx & "%'"
    DataTables(tbn).Load()
    DataTables(tbn1).LoadFilter = key2 & " Like '%" & cx & "%'"
    DataTables(tbn1).Load()
有什么本质区别吗?

 

加载照成死循环,跟着段代码应该没有关系,而是你本身其他代码引起了最后一句加载的卡死

 

你这个函数的参数过多了,函数参数超过4个以上使用就不方便了。

第一段代码是因为我的数据是动态加载的,主表加载进来的时候要通过关联列字段加载子表啊

我奇怪的是,我普通的代码能正常执行,改写成内部函数就不行了。。


 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 19:14:00 [显示全部帖子]

以下是引用lsy在2013-8-4 19:06:00的发言:

主表没有数据,下面的代码无法执行;

子表没有数据,下面的代码同样无法执行。

这样判断,就该用Orelse

改成orelse一样假死掉图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 19:37:00 [显示全部帖子]

以下是引用有点甜在2013-8-4 19:21:00的发言:
 如果用到 条件 in (1,2,...,n) 的查询,假死是正常的。

 我之前遇到过,如果括号里的个数过长,或你的数据库的数据过多的话,匹配时间是很漫长的。

 一般这种情况变通直接编写sql语句完成你要的操作比较好。
应该不是这个问题,loadfilter本身就是从后台加载,而且我是测试的数据库,才40几条主表数据,子表也不超过100条,最重要的是我本身的代码没问题,改造成内部函数后调用的时候就出问题了,一会我做个例子上来吧

 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 20:08:00 [显示全部帖子]

以下是引用lsy在2013-8-4 19:49:00的发言:

For Each dr As DataRow In DataTables(tbn).DataRows
      ids = ids & ",'" & dr(keys) & "'"
      ids= ids.Trim(",")
      DataTables(tbn1).LoadFilter = keys & "In (" & ids & ")"
Next

ids= ids.Trim(",")
DataTables(tbn1).LoadFilter = keys & "In (" & ids & ")"

 

两行红色的应该放在循环的外面。


这个放在红色之外ids取不到值的咧


 回到顶部
帅哥哟,离线,有人找我吗?
晕了快扶我
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1196 积分:7051 威望:0 精华:0 注册:2013/3/4 18:02:00
  发帖心情 Post By:2013/8/4 20:09:00 [显示全部帖子]

以下是引用有点甜在2013-8-4 19:47:00的发言:


如果不是数量大的问题,就是条件写错了。试试改改,in之前加个空格

Dim ids As String
        For Each dr As DataRow In DataTables(tbn).DataRows
            ids = ids & ",'" & dr(keys) & "'"
        Next
ids= ids.Trim(",")   
DataTables(tbn1).LoadFilter = keys & " In (" & ids & ")"
        Dim vds As String
        For Each dr As DataRow In DataTables(tbn1).DataRows
            vds = vds & ",'" & dr(keys) & "'"
        Next
vds= vds.Trim(",")
DataTables(tbn).LoadFilter = keys & " In (" & vds & ")"
[此贴子已经被作者于2013-8-4 19:50:36编辑过]

果然是这个问题,我测试了下,show出来的keys有问题,少了个空格,TKS!


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