难题!!!请教各位高人!!!

dayuforever 2005-11-09 09:24:18
有两个问题一直困扰小弟,不知各位老大有何高见
1.程序运行到某条语句的时候长时间执行,整个程序就死在那里。
是从数据库中取记录。大部分记录都能正常读取,但某几条数据也许是录入的时候本身有问题,所以程序读到这条语句的时候就一直运行,也不报错也不跳出,就是无法执行下一句了。虽然可能是数据的问题,但数据本身不受我的控制修改不了,我只可以去读取而且预先无法知道这些数据哪个正常哪个不正常,所以只能对程序入手。不知道大家对于这种长时间停顿在一条语句上的情况有什么好的建议。

2.还是读取数据库。程序中有很多窗体都执行数据库读取的操作,有的花费的时间较长。本想做一个统一的进度条窗体类似于windows中粘贴复制或者搜索时出现的那样,在每次读取的时候调用。但发现当调用这个窗体的时候程序就在这个窗体中不停地执行关于进度条的语句使之维持进度的变化,而我主要想做的查询数据库的那些语句就停在那里不执行了,当我把进度条窗体关闭才又回到查询的语句处开始执行,这样就等于没有效果。难道是因为单线程的原因吗,那如果用多线程岂不太复杂了。而我也不想在每个窗体都加上进度条何况有的情况根本就没法加。所以请各位老大指点一下,我该如何处理呢?
...全文
283 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dayuforever 2005-11-29
  • 打赏
  • 举报
回复
最近一直在忙其他的事情不好意思
rainstormmaster(暴风雨 v2.0) 兄,图片已经发出,请帮我看看,谢谢先。
(两张两种格式。一张两种格式都有问题,一张两种格式都没问题;一种格式是直接从数据库中取出来的,另一种是我保存为jpg格式的。
DengXingJie 2005-11-22
  • 打赏
  • 举报
回复
說起來也真是有點奇怪
我以前也碰到這樣的問題
在SQL Server的查詢分析器中,
當用select * from table where uid=...時,長時間出不結果
當用select * from table時,沒問題,幾秒鐘就出來結果,並且用上面那種方法出不來的那條記錄也出來了
大家說這是什麼問題?
後來我是把這條記錄Delete,則重新建過再解決問題
rainstormmaster 2005-11-21
  • 打赏
  • 举报
回复
email:hbbaoyu@163.com
rainstormmaster 2005-11-21
  • 打赏
  • 举报
回复
//是不是image 或者picturebox 不支持全部jpg的格式么?

把你有问题的jpg发给我,我帮你想想办法


dayuforever 2005-11-21
  • 打赏
  • 举报
回复
是不是image 或者picturebox 不支持全部jpg的格式么?
dayuforever 2005-11-14
  • 打赏
  • 举报
回复
难道是图片格式的问题?该图片是vb控件所不支持的吗?
dayuforever 2005-11-10
  • 打赏
  • 举报
回复
今天忙了一天,发现对于我认为有问题的纪录放到datagrid中没有问题,long raw的字段以乱码的字符串显示。然后我把long raw 字段getchunk下载到本地以jpeg格式保存,在acdsee中可以看见,在用image控件也打不开,读到load语句的时候就没有响应了。
没有语言了我。
射天狼 2005-11-09
  • 打赏
  • 举报
回复
第一个问题你可以用错误处理语句处理一下试试

第二个问题如果你只执行了一条SQL语句,就造成这样的话,是无法用DOEVENTS语句操作的,应该用我线程。
如果是多条SQL语句,则可以用DOEVENTS语句来处理。
zou19820704 2005-11-09
  • 打赏
  • 举报
回复
1,你判断一下数据是否和你要求,要是不和要求的话,你用 goto Err
Err: next
dayuforever 2005-11-09
  • 打赏
  • 举报
回复
我就是想能够做出错误判断。但我根本事先判断不了数据哪些有问题哪些没有啊。
进度窗体开始的确是以模式打开的,但后改为非模式却仍是只在进度条窗体中运行,将之关闭才开始执行查询部分。晕!
韧恒 2005-11-09
  • 打赏
  • 举报
回复
1. 应该是你程序的问题,即使用是数据有问题,也应该在程序中进行必要的错误判断处理。
2. 你的进度窗体是不是以模式对话框的方式打开的呢?这样恐怕不行。把它置顶就行了。
如果非得这样做,那么可以考虑做一个通用的处理过程,放在模块中,然后在这个进度窗体里调用这个处理过程。
dayuforever 2005-11-09
  • 打赏
  • 举报
回复
但是语句一直停在那一句上不走了,能用doevents么?有错误处理啊,我写的on error goto 就直接跳出程序,可是没有发生作用,就是说程序没有认为那是错误但却就不停的读。
至于我的读取语句就是最普通的sql,而且大部分纪录都能正常读出来,就只是碰上那几条才出现这样的情况。同时我直接 用ado控件连接数据库读取也是一样的结果。
bbhere 2005-11-09
  • 打赏
  • 举报
回复
第一个问题通常的解决办法就是doevents
第二个不知道
rainstormmaster 2005-11-09
  • 打赏
  • 举报
回复
可以用doevents语句,将控制权交还给系统,不过,我还是建议你检查一下你读取数据库的程序,虽然我不知道你的程序是怎么写的,但我感觉应该是你的程序的问题,最起码你的程序要有错误处理的部分

另外,你最好把数据库的结构帖出来
Summer006 2005-11-09
  • 打赏
  • 举报
回复
2,是远程数据库服务器吧。几千万级数据库的查询,
首先,数据库要做索引,要把最常查询的字段做索引,几千万的话应该要有3-5个索引吧。 另外日期时间类型尽量弄成索引
其次,查询的时候尽量用已经做到的索引来查,要避免用没有做索引的字符型的模糊查询。
其他似乎也没啥好办法了。
sqfeiyu 2005-11-09
  • 打赏
  • 举报
回复
我覺的有可能是imgpic字段的內容太大或格式出錯造成的。否則不應該會是你說的那樣只有某几條記錄出問題。
試試不取imgpic字段還會不會出錯﹐如果沒問題﹐則要考慮圖片的問題了
dayuforever 2005-11-09
  • 打赏
  • 举报
回复
首先,感谢楼上各位的热情回应,看来100分太少了。呵呵,谁能告诉我怎么追加分啊?
其次,我再详细描述一下我问题吧
1.先从一张表中选出所有符合条件的纪录放到mshflex中,这里是一些人员的信息。然后点击mshflex中某一行的人员信息,得到该人员的id值,然后根据该唯一值去一张照片表中对应取出该人员的照片放入image中显示,过程就是这样。关键在于用id值在照片表中得到包含LONG RAW 格式的照片字段PIC的数据集rs后,set datasource 赋给image控件imgpic,再绑定字段imgpic.datafield=PIC。正常的纪录到这一句话后就顺利过去了,但某几条纪录就停在这里,不停地读不往下走了。 程序没有认为是错误,只是不停地读,所以不管是on error goto 还是resume 都起不了作用的啊。
2.其实查出来的结果集并不算大多,也就几千条的样子,但就是进行查找的数据集就比较多大概有个几千万条。所以时间主要花在查找的过程上了。
Summer006 2005-11-09
  • 打赏
  • 举报
回复
哦。。。哦。。。

lz你的第二种情况,我刚刚才研究过解决办法,也是oracle数据库吧。 数据量很大吧。呵呵

假设你的查询语句是“select * from table",
假设一查就是几分钟,返回记录n多条。我这样解决:
先用“select count(*) from table" 获取记录总数,
如果数量很小,只有几十条,就用原方法得了。
如果数量很大,有几w, 就得分批查询了:

select * from table where rownum<10000
先取头一万条记录。 取回来马上显示 ,然后进度为1w除以总数

select * from table where rownum<20000 minus
select * from table where rownum<10000
再取跟着的一万条记录。 。。依次类推。。。

ps: rownum不能用and 连接,oracle也不支持top查询
Summer006 2005-11-09
  • 打赏
  • 举报
回复
1,应该是程序语句的问题,当死起的时候,用ctrl+ pause 中断,然后单步调试,看看哪里引起了死循环。

2,如果数据量很大,单就一个查询 rs= gConn.Execute("select * from table") 都要很久很久的话,那就只有对其分解了。比如rs= gConn.Execute("select top 100 * from table")先取100来显示先,再继续取后面。。

如果不是上面的情况,vb本身的语句没有阻塞,那就可以用一个全局变量表示进度, 在处理的程序内部修改这个进度变量, 外面弄个timer,每隔1s取这个变量进行一下进度显示,就ok了。
上官云峰 2005-11-09
  • 打赏
  • 举报
回复
用 on error resume next 显示出结果,看看那几条或那列没有显示出来,然后在数据库中看看相应的记录,
我记得从excel向access导入数据的时候,excel的数据就是有几行得不到,最后发现是这几条记录得某些值后面有很长得空格,将空格删除,程序运行ok了,我晕
加载更多回复(1)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧