CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  数据库(包含打印,安装,报表)

老生长谈的问题!请教各位是如何在进行大数据量的数据库操作时显示进度地?

楼主ymize(不知所。云)2004-05-02 16:55:48 在 VB / 数据库(包含打印,安装,报表) 提问

老生长谈的问题!请教各位是如何在进行大数据量的数据库操作时显示进度地?  
  我想了很久,在论坛上也查了很久都没有找到理想的方法,我的想法是把数据操作  
  (我这里的数据库操作基本都是前台带参数调用后台的存储过程)和进度显示封装  
  在一起需要进行时调用即可。但是我想不出该怎么做才好,请各位前辈指教一,二。  
            谢谢!有可能的话把大家使用的类似的程序发一份给我学习一下!  
              邮件地址是kisc@public.wh.hb.cn  
              再次感谢!    
   
         
  问题点数:100、回复次数:61Top

1 楼ymize(不知所。云)回复于 2004-05-02 21:14:23 得分 0

晕!没人指点下啊:(  
  自己顶Top

2 楼tangxiaosan001(阿三)回复于 2004-05-02 22:21:47 得分 0

我也正在研究这个问题。  
  不过,存储里好象有哪个什么state表示百分比来着Top

3 楼homeland520(天山之王(哈哈两声说Beybey))回复于 2004-05-03 01:02:16 得分 0

学习!继续关注Top

4 楼ymize(不知所。云)回复于 2004-05-03 12:25:52 得分 0

自己顶。。。。  
  Top

5 楼ymize(不知所。云)回复于 2004-05-03 17:05:04 得分 0

要是分不够的话偶再加100  
  Top

6 楼daisy8675(莫依 沉迷)回复于 2004-05-03 19:21:14 得分 50

 
      '讀取資料並   Show   於   Datagrid  
      g_sql   =   "select   c_cust.cust_name,c_cust.area,c_cust.ck_name,c_cust.cp_name,   c_lman2.l_class,c_lman2.L_name,c_lman2.L_tel"   &   _  
                      "   from   c_cust   ,c_lman2   where   c_cust.cust_no=c_lman2.custno"  
      rs1.Close  
      If   make_i(g_sql)   =   flase   Then  
              MsgBox   (db_err)  
              Unload   Me  
      End   If  
       
      With   MSFlexGrid1  
            .Rows   =   2  
            .Row   =   0  
            .Col   =   0  
            .ColWidth(0)   =   1400  
            .Text   =   "公司名稱"  
            .Col   =   1  
            .ColWidth(1)   =   1400  
            .Text   =   "職稱"  
            .Col   =   2  
            .ColWidth(2)   =   1400  
            .Text   =   "稱謂"  
            .Col   =   3  
            .ColWidth(3)   =   2000  
            .Text   =   "電         話"  
            .ColWidth(4)   =   0   '   隱藏的欄位  
       
      End   With  
       
      Dim   a_cnt   As   Integer:   a_cnt   =   0  
      Do   While   Not   rs1.EOF  
            a_cnt   =   a_cnt   +   1  
            rs1.MoveNext  
      Loop  
      rs1.MoveFirst  
      '顯示進度的   Status   Bar  
      fra_loaded.Visible   =   True  
      ProgressBar1.Max   =   a_cnt  
      ProgressBar1.Min   =   0  
      ProgressBar1.Value   =   0  
      Do   While   Not   rs1.EOF  
             
            DoEvents  
            With   MSFlexGrid1  
                    '   row   的啟始值為   0,   column   的啟始值也是   0  
                    .Row   =   .Rows   -   1  
                    .Col   =   0  
                    .Text   =   rs1("cust_name")  
                    .Col   =   1  
                    .Text   =   IIf(IsNull(rs1("l_class")),   "",   rs1("l_class"))  
                    .Col   =   2  
                    .Text   =   rs1("l_name")  
                    .Col   =   3  
                    .Text   =   IIf(IsNull(rs1("l_tel")),   "",   rs1("l_tel"))  
                   
                  .Rows   =   .Rows   +   1  
            End   With  
             
            ProgressBar1.Value   =   ProgressBar1.Value   +   1  
       
            rs1.MoveNext  
      Loop  
       
   
  一個示范,你隻能發100的貼,呵呵Top

7 楼ymize(不知所。云)回复于 2004-05-03 23:19:29 得分 0

能解决的话偶连开两个100分的送分贴就行了  
  以上这个程序没看见你打开记录集啊?  
  而且你是在读取记录之后开始显示的时候才进行进度显示的吧  
  偶现在遇到的问题是查询时间比较长  
  返回记录时间短  
  不过还是感谢楼上  
  你是第一个回实质帖子的人  
  Top

8 楼wancl(wancl)回复于 2004-05-04 09:41:30 得分 0

只能表示同情了,我也不会,不过比你更想知道Top

9 楼sekingsboy(不后悔)回复于 2004-05-04 10:37:03 得分 10

dim   rs   as   adodb.recordset  
  rs.open   sql,conn,3,2  
  prg.max=rs.recordcount  
  do   until     rs.eof  
  'do   something  
  rs.movenext  
  prg.value=z  
  z=z+1  
  loop  
  Top

10 楼yenight(抵制日货 利国利民 能不买日货,尽量不买)回复于 2004-05-04 11:17:58 得分 0

进度条只是一个骗人的东东,你没有看见Windows的拷贝东东时要一百多年的条吗?  
  只能说进度条给一个大概的进度,楼上的方法可行!Top

11 楼mingtian2008(明天)回复于 2004-05-04 14:45:16 得分 0

upTop

12 楼jintianatxd(tian)回复于 2004-05-04 14:58:13 得分 0

gz   ing...Top

13 楼ymize(不知所。云)回复于 2004-05-04 15:04:16 得分 0

问题是偶不想把每个程序都加循环和进度条  
  不能作成一个包含进度显示的查询模块吗?  
  楼上的解决方法都是要等返回值之后知道  
  返回的记录数然后在显示的时候同时显示模拟进度  
  如果我用服务器游标呢?无法知道记录数怎么办?  
  如果查询时间比较长(超过3分钟)怎么办?  
  虽然是特例但是偶想能做的严谨一点也好  
  我现在想的方法是做一个包含进度显示的表单  
  然后定义2个public变量   一个是传递查询的sql字符串,一个是返回的记录集  
  需要运行查询的时候就显示该表单并传递sql查询的字符串,运行完毕后返回一个记录集  
  但是现在我遇到的问题是在这个查询表单内使用异步方式打开记录集进行查询的话  
  程序在没有查询完毕就直接运行下面的语句,并返回一个错误的值  
  因为这个方法没有成功所以我想请教各位前辈有没有更好地办法!Top

14 楼ymize(不知所。云)回复于 2004-05-05 00:09:47 得分 0

自己再顶Top

15 楼jackyped(MSN: jpu_jacky@eyou.com)回复于 2004-05-05 09:48:03 得分 0

WINDOWS   的进度条好象是按文件个数计算的。10   个文件,复制一个   1K   的文件和复制一个100M的文件在进度中占的位置一样多。  
   
  装WIN   时发现的。使用WIN   时没验证。错了别打我~!Top

16 楼wudid007(小小鸟)回复于 2004-05-05 11:07:21 得分 0

dinTop

17 楼ymize(不知所。云)回复于 2004-05-05 17:08:48 得分 0

这个问题大家因该都遇到过吧  
  怎么都没有好方法??Top

18 楼HHLADN(I Want to exceed you)回复于 2004-05-05 17:28:57 得分 0

靠,不愧是兩個星的;  
  佩服!Top

19 楼taosihai1only(无招胜有招)回复于 2004-05-05 17:37:45 得分 0

upTop

20 楼wumylove1234(毁于随)回复于 2004-05-05 19:21:36 得分 0

靠,不愧是兩個星的;  
  佩服!  
   
  嘴真他的不干不净!Top

21 楼daisy8675(莫依 沉迷)回复于 2004-05-05 19:40:46 得分 0

以上这个程序没看见你打开记录集啊?  
  而且你是在读取记录之后开始显示的时候才进行进度显示的吧  
  偶现在遇到的问题是查询时间比较长  
  ///  
  這個程序是一個示范,怎麼顯示進度條。  
  我的打開是調用make_i,是一個共用的bas  
  你換成rs1.open   g_sql,conn,3,3就可以呀  
   
  查詢的時間比較長,我不知道你認為長到多少時間,如果是太長,使得處於假死狀態的時候,建議你分解查詢,或者用view完成。查詢使不能用進度顯示的,而且也不適合:)Top

22 楼ymize(不知所。云)回复于 2004-05-05 23:57:15 得分 0

我的意思是说在查询的时候显示模拟进度。。。只要告诉用户查询正在进行没有死机  
  就好Top

23 楼daisy8675(莫依 沉迷)回复于 2004-05-06 18:54:05 得分 0

今天有在想這個問題。  
   
  可以用時鐘進行控制,一秒或者二秒,   ProgressBar1.Value   =   ProgressBar1.Value   +   1  
  可以寫一個function進行控制。  
   
  問題是抓不準結束的時間。  
   
  我上面的程序實際上把查詢和顯示是一起用進度條顯示了。  
   
  Top

24 楼leolulu(了哦)回复于 2004-05-06 19:03:04 得分 0

很好啊,我也想做一个进度条呢,就是没试成功,这个方法不错,进行条数的定义,完全可以满足简单的显示了~~~~~~~~`  
   
  :)  
   
  嘿嘿,谢谢了。。Top

25 楼ymize(不知所。云)回复于 2004-05-06 19:16:30 得分 0

对!我也是设想的用时钟控制查询开始时就激活时钟查询结束后始终终止  
  然后在时钟运行时显示模拟进度  
  但是我也是找不到正确返回值的时机  
  用异步方式打开的话查询没结束就直接执行下面的语句  
  然后就报错  
  如果不用异步模式的话查询进行时时钟就挂起了到查询结束以后才  
  显示模拟进度。。。头痛就在这个地方啊Top

26 楼daisy8675(莫依 沉迷)回复于 2004-05-06 19:21:26 得分 0

你的查詢到底要多久,我覺得這個問題才好玩。  
     
    你想想windows的查詢,它有個查詢圖標一直就在轉動,到查詢的文件顯示完畢以後它就會停止。  
   
  所以放進數據查詢,我覺得隻有數據顯示完畢了以後,進度條才能為100%  
   
  我的是5W多筆數據,我也不怎麼覺得慢。還有一個,用了進度條其實速度好象感覺會還慢一點,隻是不死機器,呵Top

27 楼daisy8675(莫依 沉迷)回复于 2004-05-06 19:42:57 得分 0

剛在ms的知識庫找了,居然這方面的東西很少噢。結束點不好抓。呵呵,不好抓。Top

28 楼ymize(不知所。云)回复于 2004-05-06 19:57:43 得分 0

我的数据量不是很大大概200万条吧(销售流水)  
  我记得我在书上看过  
  vb本身好象不支持多线程吧  
  进度显示好象就是多线程吧?(外行做程序很多基础没学不好意思)  
  我也没想显示百分比显示也是个假的  
  查询时显示个框里面显示查询进行了多长时间  
  反正让用户知道没死机就行了呵呵呵呵  
  Top

29 楼4103796(潇湘予)回复于 2004-05-06 20:12:24 得分 0

有循环的时候在循环体内显示进度可以,但我做过数据库的备份需要一分多钟,只一条语句。BACKUP。。。。。这里无法显示进度我曾试着在语句的上面加一条TIMER。ENABLE   =TRUE   在时间控件的内部显示进度条。但时间控件得不到响应备份完了才响应。根本没用的唉,高手指点啊。  
  Top

30 楼daisy8675(莫依 沉迷)回复于 2004-05-06 20:21:08 得分 0

樓上的備份怎麼做的。我用了,沒有問題的  
   
  對200W,我沒有測試環境。  
   
  我這邊用得最久的查詢會查上3分鐘,樓主有沒用試我給的代碼?Top

31 楼ymize(不知所。云)回复于 2004-05-06 20:24:48 得分 0

我用的就是你那种方法写在timer控件里  
  结果是如果异步打开就报错  
  不使用异步方式就要等查询完毕后timer才有反映哦Top

32 楼daisy8675(莫依 沉迷)回复于 2004-05-06 20:28:22 得分 0

ei?不會呀,偶今天沒有時間,明天有時間給你做個看看  
   
  偶的程序就是用這辦法的Top

33 楼ymize(不知所。云)回复于 2004-05-06 20:31:14 得分 0

好哦!有msn吗?方便联系啊!  
  初学有很多问题要讨教呵呵呵呵Top

34 楼4103796(潇湘予)回复于 2004-05-06 20:34:05 得分 10

主要代码:  
  timer.enable=true                                       '以为激活时间控件。走进度条  
  conn.exeture"backup   ..................."       '需要一分多钟,以为进度条这段时间自己走呗  
  timer.enable=false                                                   '实际不可能。执行备份语句的时候,系统不响应时间控件。                                                                    
   
  次要的:  
  timer过程()  
          每隔一段时间进度指示器走一格。  
  end   sub  
   
   
   
  Top

35 楼ymize(不知所。云)回复于 2004-05-06 20:34:18 得分 0

我的是ymize@263.netTop

36 楼ymize(不知所。云)回复于 2004-05-06 20:35:38 得分 0

潇湘和偶遇到的问题一样如不使用异步模式就是他说的哪个效果Top

37 楼4103796(潇湘予)回复于 2004-05-06 20:37:36 得分 0

异步的思路是怎样的,我如果做,从哪方面入手???Top

38 楼ymize(不知所。云)回复于 2004-05-06 20:49:44 得分 0

我用的是recordset.open   sql  
  方式   open方法的可选参数里有异步方式执行的参数  
  msn里有客气去查下哦  
  我记得连接的exeture方法也有异步方式  
  但是我没试出来msn里有这个参数但是没例子  
  我也是初学   所以有些东西就不知道了  
  我知道的都是msn里的中文内容  
  英文的好多看不懂就没怎么看Top

39 楼daisy8675(莫依 沉迷)回复于 2004-05-06 20:53:50 得分 0

沒有MSN,公司不許用,偶要斷網了。  
  今天感冒,頭痛,明天還要趕案子,recordset後面cursortypenum,locktypeenum偶怎麼不覺得有什麼。msdn裡面是中文呀,  
  對這rs.state按,就出來了。  
   
  Top

40 楼ymize(不知所。云)回复于 2004-05-06 20:56:43 得分 0

遗憾。。莫依兄  
  家里的机器没装这些东西  
  程序和记录都在公司里  
  Top

41 楼4103796(潇湘予)回复于 2004-05-06 21:00:45 得分 0

我遇到了这样的问题,导出EXCEL之后,再导出就在写入数据那行出错了不知为什么如下:  
  range(...,...).value=二维数据。  
  本来这样可以把二维数据写进表格中。第一次可以,再次使用的时候,就出错了,应用对象,工作薄表格都关闭并且已经置成NOTHING了。可是还出错而且用CTrl+alt+del三个键,能发现有一个EXCEL进程在系统中。我退出我的应用程序此进程不消失。再启动程序并且再导出一次表格。又出现一个。依次类推,每次启动程序并且导出表格就出现一个进程。就这两个问题请高手帮忙啊。。Book.Save  
          Book.Close  
          Set   Book   =   Nothing  
          Exl.Quit  
          Set   Exl   =   Nothing  
          sheet.close  
          set   sheet=nothing  
        我已经用了。Top

42 楼4103796(潇湘予)回复于 2004-05-06 21:21:11 得分 20

 
          Dim   ex   As   Object  
          Dim   exwbook   As   Object  
          Dim   exsheet   As   Object  
           
          Set   ex   =   CreateObject("Excel.Application")  
          Set   exwbook   =   Nothing  
          Set   exsheet   =   Nothing  
          Set   exwbook   =   ex.Workbooks().Add  
          Set   exsheet   =   exwbook.Worksheets("sheet1")  
           
           
          '写数据  
          Dim   MyArray()   As   String  
          MyArray()   取值。  
          Range(Cells(3,   1),   Cells(WgMc.Rows   +   2,   WgMc.Cols)).Value   =   MyArray  
           
   
                          exwbook.SaveAs   sFile  
   
                          exwbook.Close  
                            ex.Quit  
                          Set   ex   =   Nothing  
                          Set   exwbook   =   Nothing  
                          Set   exsheet   =   Nothing  
   
  Top

43 楼daisy8675(莫依 沉迷)回复于 2004-05-07 18:32:27 得分 0

先t上來。偶先換個鼠標再講Top

44 楼daisy8675(莫依 沉迷)回复于 2004-05-07 19:27:07 得分 0

今天沒有試,沒有辦法沒有時間-_-  
   
  Private   Sub   Timer1_Timer()  
          intValue   =   intValue   +   1:   frmProgressBar.prgReading.Value   =   intValue  
          If   intValue   Mod   8   =   1   Then   frmProgressBar.lblSearching.Caption   =   "正在搜索硬體,請稍後"  
          If   intValue   Mod   8   =   3   Then   frmProgressBar.lblSearching.Caption   =   "正在搜索硬體,請稍後.."  
          If   intValue   Mod   8   =   5   Then   frmProgressBar.lblSearching.Caption   =   "正在搜索硬體,請稍後....."  
          If   intValue   Mod   8   =   7   Then   frmProgressBar.lblSearching.Caption   =   "正在搜索硬體,請稍後..........."  
  End   Sub  
  Private   Sub   Form_Load()  
          If   g_Flag   =   True   Then  
                  prgReading.Min   =   0  
                  prgReading.Max   =   900  
                  Timer1.Enabled   =   True  
                  lblReadData.Visible   =   False  
                  lblReading.Visible   =   False  
                  lblSearching.Visible   =   True  
          End   If  
  End   Sub  
   
  但是肯定告訴你進度條是假的,有段代碼好發上來,呵呵,你要有mail。我明天整理mail到你信箱去好了。  
   
  寶寶在做考勤的時候,有搜索port的過程,這需要進度條控制,但是誰也不知道port什麼時候搜索到。包括查詢顯示,反正就那意思了。進度條可以直接跳到100  
  frmProgressBar.prgReading.Max   =   dblTotal  
          frmProgressBar.lblReading   =   Format(m_ClockNo,   "00")   &   "號卡鐘資料讀取中....."  
          cboClockList.AddItem   Format(CStr(intMachineNo),   "00")   &   "卡鐘",   m_intOrderNo  
  這樣就不for循環了Top

45 楼ymize(不知所。云)回复于 2004-05-07 21:55:35 得分 0

kisc@public.wh.hb.cn这是偶的mail  
  明天上班偶再试下先Top

46 楼vbdata(独一无二)回复于 2004-05-07 22:48:59 得分 0

本站VB,数据库版内有一个关于批量转换文本文件的小问题,请各位高手帮忙,  
  我一定加分。  
   
  标题     高分求助,如何读取文本文件中的数值,批量转换?    
  时间     05-07   22:   30  
   
  谢谢各位了。Top

47 楼ymize(不知所。云)回复于 2004-05-08 17:16:35 得分 0

自己顶Top

48 楼viena(维也纳N02)回复于 2004-05-08 17:34:16 得分 0

用什么进度条吗?不是表示没有死吗?用状态栏显示“查询中,请稍候”,把鼠标光标变成沙漏就好了,或者用一个Label,或者显示动画,都可以呀Top

49 楼orsharp(露璐)回复于 2004-05-08 17:46:14 得分 0

我也呈经遇见过类似的问题,不知道是否适合:   我做的是一个数据库转录程序   倒出为Excel   同样是数据量比较大   转录的时候时间比较长,需要进度.   我的办法是:   先根据条件查询(确定倒出需要的那部分数据),   由于用代码直接查询   看不具体查到了多少条纪录   ,因此   先用个循环   检测一下具体查到了多少条纪录   然后   把   检测到的数值   给   ProgressBar1.Max   接着开始   转录     循环中   再把   转录的第N条纪录   传递给   ProgressBar1.Value     这样就可以完全真实显示进度了,不要忘了   在循环的入口处   加一条     DoEventsTop

50 楼ymize(不知所。云)回复于 2004-05-08 20:01:59 得分 0

接个。。。偶重新说一次  
  首先。。。我现在考虑的查询时间长返回记录时间相对短  
  所以在查询这个时间段内是没办法知道会返回多少记录  
  第二   如果直接使用rs.open   sqlstr   方式打开的话  
  系统资源全部被占用了   没办法动态显示正在查询的信息  
  如果使用   异步方式打开rs   则查询未结束   查询后的语句就开始执行  
  然后报错  
  我现在没办法是在异步打开rs语句的后面加上了  
  do    
  ....  
  ......  
  .......  
   
  DoEvents  
  loop  
  的方式来不停的查询rs状态   等rs.state=1   才开始执行下面的语句解决这个问题  
  但是使用DoEvents好象对系统资源占用比较大  
  所以我发帖子问问看大家有什么其他的好办法  
   
  Top

51 楼ymize(不知所。云)回复于 2004-05-09 11:39:53 得分 0

自己顶Top

52 楼lovebeethoven(小佛-寻找幸福)回复于 2004-05-09 11:50:00 得分 0

gzTop

53 楼recollectpainer(忆苦儿)回复于 2004-05-09 11:53:57 得分 0

那是莫依JJ哟,不是你的莫依兄!         HOHO~~~~Top

54 楼cuibin(黑侠)回复于 2004-05-09 13:16:43 得分 0

建议你做个假的动画,就象拷贝文件一样。飞来飞去。做完了就结束。Top

55 楼ymize(不知所。云)回复于 2004-05-09 13:22:12 得分 0

.....接个。。。jj?还是mm比较好  
  jj叫老了  
  偶当然想做个动画问题在于怎么让查询同时显示动画哦  
  要么报错  
  要么就是查完了再显示  
  还就是做不到查询的时间内显示动画呵呵呵呵Top

56 楼passer_wave(路人)回复于 2004-05-09 13:35:58 得分 10

进度条的计算是不可能精确的,只是个模糊数,大概数,估计数而已。  
  系统中的,文件copy,远程的下载安装就是个很好的例子。  
   
  项目中遇到大量数据处理之类的时候我都不用什么进度条了,都是改用   直接load一个这样的窗体  
  VERSION   5.00  
  Begin   VB.Form   Dialog    
        BackColor               =       &H0080C0FF&  
        BorderStyle           =       0     'None  
        Caption                   =       "对话框标题"  
        ClientHeight         =       915  
        ClientLeft             =       2715  
        ClientTop               =       3420  
        ClientWidth           =       3285  
        ForeColor               =       &H00000000&  
        LinkTopic               =       "Form1"  
        MaxButton               =       0       'False  
        MinButton               =       0       'False  
        ScaleHeight           =       915  
        ScaleWidth             =       3285  
        ShowInTaskbar       =       0       'False  
        StartUpPosition   =       2     '屏幕中心  
        Begin   VB.Label   Label1    
              AutoSize                 =       -1     'True  
              BackStyle               =       0     'Transparent  
              Caption                   =       "请稍等,正在计算。。。。"  
              ForeColor               =       &H00FF0000&  
              Height                     =       180  
              Left                         =       540  
              TabIndex                 =       0  
              Top                           =       360  
              Width                       =       2160  
        End  
  End  
  Attribute   VB_Name   =   "Dialog"  
  Attribute   VB_GlobalNameSpace   =   False  
  Attribute   VB_Creatable   =   False  
  Attribute   VB_PredeclaredId   =   True  
  Attribute   VB_Exposed   =   False  
  Option   Explicit  
  Private   Declare   Function   SetWindowPos   Lib   "user32"   (ByVal   hwnd   As   Long,   ByVal   hWndInsertAfter   As   Long,   ByVal   x   As   Long,   ByVal   y   As   Long,   ByVal   cx   As   Long,   ByVal   cy   As   Long,   ByVal   wFlags   As   Long)   As   Long  
   
  Const   HWND_TOPMOST   =   -1  
   
  Private   Sub   Form_Load()  
  SetWindowPos   Me.hwnd,   HWND_TOPMOST,   Me.Left   /   Screen.TwipsPerPixelX   _  
  ,   Me.Top   \   Screen.TwipsPerPixelY,   Me.Width   \   Screen.TwipsPerPixelX,   _  
  Me.Height   \   Screen.TwipsPerPixelY,   0  
  End   Sub  
   
  (以上代码,copy以后,另存为   Dialog.frm文件)  
   
  然后在过程结束的时候   unload它,具体:  
  Private   Sub   Cmd1_Click()  
          Dialog.Show  
          cmd1.Enabled   =   False  
          DoEvents  
          Call   somesub'你的过程或者是大量的数据查询  
          Unload   Dialog  
          cmd1.Enabled   =   True  
          Set   Dialog   =   Nothing  
  End   SubTop

57 楼ymize(不知所。云)回复于 2004-05-09 14:25:00 得分 0

楼上和我现在用的办法差不多。。当然我做的没有楼上的前辈精致  
  可能偶要求太高了呵呵呵呵  
  楼上的前辈显示的是个静态的窗体  
  我希望得到的是一个动态的窗体我现在用的是这样的方法  
  VERSION   5.00  
  Begin   VB.Form   planFrm    
        BorderStyle           =       0     'None  
        Caption                   =       "Form1"  
        ClientHeight         =       615  
        ClientLeft             =       0  
        ClientTop               =       600  
        ClientWidth           =       5670  
        ControlBox             =       0       'False  
        LinkTopic               =       "Form1"  
        ScaleHeight           =       615  
        ScaleWidth             =       5670  
        ShowInTaskbar       =       0       'False  
        StartUpPosition   =       2     '屏幕中心  
        Begin   VB.Timer   Timer1    
              Enabled                   =       0       'False  
              Interval                 =       100  
              Left                         =       360  
              Top                           =       120  
        End  
        Begin   VB.Label   Label1    
              BackColor               =       &H005076F8&  
              BorderStyle           =       1     'Fixed   Single  
              Caption                   =       "Label1"  
              Height                     =       375  
              Left                         =       120  
              TabIndex                 =       0  
              Top                           =       120  
              Width                       =       5415  
        End  
        Begin   VB.Shape   Shape1    
              BackColor               =       &H80000000&  
              BackStyle               =       1     'Opaque  
              Height                     =       615  
              Left                         =       0  
              Top                           =       0  
              Width                       =       5655  
        End  
  End  
  Attribute   VB_Name   =   "planFrm"  
  Attribute   VB_GlobalNameSpace   =   False  
  Attribute   VB_Creatable   =   False  
  Attribute   VB_PredeclaredId   =   True  
  Attribute   VB_Exposed   =   False  
  Option   Explicit  
  Private   a   As   Integer  
  Private   backrs   As   ADODB.Recordset  
  Private   Sub   Form_Load()  
      Set   backrs   =   New   ADODB.Recordset  
      backrs.CursorLocation   =   adUseClient  
      backrs.CursorType   =   adOpenStatic  
      backrs.LockType   =   adLockReadOnly  
      backrs.CacheSize   =   1000  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
          backrs.Close  
          Set   backrs   =   Nothing  
  End   Sub  
   
  Private   Sub   Timer1_Timer()  
        If   backrs.State   And   adStateOpen   Then  
        Else  
              a   =   a   +   1  
              Label1.Caption   =   a  
        End   If  
  End   Sub  
   
  Public   Function   excsql(ByVal   str   As   String)   As   ADODB.Recordset  
      Dim   msg   As   String  
      Timer1.Enabled   =   True  
      If   backrs.State   =   1   Then  
            backrs.Close  
      End   If  
      backrs.Open   str,   cnn,   3,   3,   adAsyncFetch   +   adAsyncExecute  
       
      Do  
          If   backrs.State   And   adStateOpen   Then  
                Set   excsql   =   backrs  
                MsgBox   ("成功查询!")  
                Timer1.Enabled   =   False  
                Exit   Do  
                Unload   Me  
          End   If  
          DoEvents  
      Loop  
  End   Function  
   
  调用时的代码例子如下  
  Private   Sub   Command1_Click()  
        Dim   frm2str   As   String  
        Set   frmrs   =   New   ADODB.Recordset  
        frmrs.CursorLocation   =   adUseClient  
        frmrs.CursorType   =   adOpenKeyset  
        frmrs.LockType   =   adLockReadOnly  
        frm2str   =   "exec   cs4   '2002-01-01   00:00:00.000','2002-02-01   00:00:00.000'"  
        planFrm.Show  
        Set   frmrs   =   planFrm.excsql(frm2str)    
        MsgBox   (frmrs.RecordCount)  
        Set   DataGrid1.DataSource   =   frmrs  
        Me.SetFocus  
  End   Sub  
  是可以使用的  
  我贴这个帖子是想看看有没有其他更好点的办法来进行查询时的进度显示  
  而且我这个方法必须在  
  backrs.Open   str,   cnn,   3,   3,   adAsyncFetch   +   adAsyncExecute   语句  
  后面加上  
  Do  
          If   backrs.State   And   adStateOpen   Then  
                。。。。。。  
                。。。。。。  
                。。。。。。  
          End   If  
          DoEvents  
  loop  
  才能正常运行  
  我想看看有什么替代的方法因为我看很多帖子说  
  使用doevents比较占用资源而且在交互方面可能出问题  
       
  Top

58 楼passer_wave(路人)回复于 2004-05-09 14:46:20 得分 0

其实方法是多种多样的,不一定说硬是要要那种的。     具体的看情况而定选择了  
   
  以前也是用进度条来显示的,但是觉得很累,麻烦。  
  其实无法就是给用户提供一个说明而已,我觉得就是用这种笨办法就得了,而且方便。   ^_^  
   
  如果是如数据实时采集这类的项目,要显示当前数据情况的进度还包括明细的内容,当然用这个就显得不专业了,就要另当别论了。  
   
   
   
  总之对数据的处理,查询之类的,俄就是这样处理了,不管了,不改了。  
  最多再加上一个累加的数据总和出来显示给用户就得了。Top

59 楼ymize(不知所。云)回复于 2004-05-09 14:55:18 得分 0

呵呵呵呵!主要是公司数据库的结构做的不是太好  
  (我没有改数据结构的能力:()  
  查询时间很长(如果多台机器查询经常超过3分钟)  
  所以不敢显示一个静止画面太长时间  
  所以需要做动态的显示模拟进度  
   
  Top

60 楼daisy8675(莫依 沉迷)回复于 2004-05-09 18:47:02 得分 0

昨天發給你的mail今天被打回來了,好象是地址打...:(  
  程序取不下來,要明天取弄,我今天先參考一下路人的代碼看看Top

61 楼ymize(不知所。云)回复于 2004-05-09 19:03:03 得分 0

谢谢先Top

相关问题

  • 求一个操作数据库的进度条
  • 数据库操作
  • 数据库操作
  • 数据库操作
  • 老生长谈:Js生成树代码.
  • vc操作access数据库
  • 关于数据库操作
  • 数据库并发操作!
  • 简单数据库操作
  • 对数据库的操作

关键词

  • 查询
  • 数据
  • 语句
  • 数据库
  • vb
  • 控件
  • 进度
  • 显示
  • exwbook
  • frmprogressbar

得分解答快速导航

  • 帖主:ymize
  • daisy8675
  • sekingsboy
  • 4103796
  • 4103796
  • passer_wave

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo