如果我的VB正在执行一段较长时间的SQL语句,有没有办法做一个进度条呢?

coollele 2005-03-23 12:04:31
因为我的程序经常要从数据服务器上取数据,且记录数很多,时间比较长,得到数据后,有些情况还要计算才能显示到表格中,但是这一过程中,操作者不知道,经常在未执行完就给整个程序结束掉了。
我在想,有没有办法给它搞个进度条,这样就可解决此问题!

最好能给出例子

谢谢!~~

例1:
for n=0 to 10000000
n=n+1
next
例2:
sql="select * from information"
rs.Open sql, conn, adOpenDynamic, adLockBatchOptimistic
If Not rs.EOF Then
Set DataGrid1.DataSource = rs
DataGrid1.Refresh
Else
While Not rs.EOF
N = N + rs!库存
N1 = CDec(N1) + CDec(rs!库存 * rs!零价)
rs.MoveNext
Wend

StatusBar1.Panels(1) = "库存数量:" & N
StatusBar1.Panels(2) = "库存金额:" & N1


如上述
在例1或例2中,有没有可能做个进度条,让操作者知道要等多久。
...全文
276 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hassle 2005-03-23
  • 打赏
  • 举报
回复
Microsoft Windows Common Controls 6.0

例1

Dim nMax As Long
Dim i As Long, j As Long

nMax = 10000

ProgressBar1.Max = nMax
ProgressBar1.Min = 0
ProgressBar1.Value = 0

j = 0
For i = 0 To nMax
j = j + 1
ProgressBar1.Value = ProgressBar1.Value + 1
Next

end sub

例2

rs.movelast
ProgressBar1.Max = rs.recordcount
coollele 2005-03-23
  • 打赏
  • 举报
回复
哇,楼上,如果去看书,是不是有点临时抱佛脚的意思啊。。。

有没有一步蹬天(现成案例)的法子啊。
ccunion 2005-03-23
  • 打赏
  • 举报
回复
建议你看看 windows核心编程Visual Basic(好像是叫这个名字)
libralibra 2005-03-23
  • 打赏
  • 举报
回复
先取得要进行的总次数,作为max
大概就是这个意思,下面就好写了
coollele 2005-03-23
  • 打赏
  • 举报
回复
对不起各位,我现在是这样写的,程序能运行,但无法实现滚动条的效果

我将代码列出:

Option Explicit
Private WithEvents rs As ADODB.Recordset
(.....)

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

sql="select * from information"
rs.Open sql, conn, adOpenDynamic, adLockBatchOptimistic, adAsyncFetch

ProgressBar1.Max = rs.RecordCount
ProgressBar1.Min = 1

If Not rs.EOF Then
Set DataGrid1.DataSource = rs
DataGrid1.Refresh
Else
Set DataGrid1.DataSource = rs
DataGrid1.Refresh
MsgBox "没有符合条件的查询!"
End If

(.....)

Private Sub Rs_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)

ProgressBar1.Value = Progress
StatusBar1.Panels(4) = Progress

DoEvents

End Sub


请教什么地方错了吗?
flyingZFX 2005-03-23
  • 打赏
  • 举报
回复
我可以这样告诉你,

你本身的这种想法就是错误的。

做为一个程序员,或者数据库管理员来说,

如果让你的SQL语句在执行的时候需要很长的一段时间来等待的话,那就是大错而特错。

你应该尽理的去改善你的SQL语句,使其能够在尽可能少的耗时的情况下,去完成任务。
aiur2000 2005-03-23
  • 打赏
  • 举报
回复
例2,也只有1步,用100/rs.recordcount,其他同上


其他多步情况,例如将1和2综合,即手动分个百分比,将1设为20%,2设为80%,然后加即可。
aiur2000 2005-03-23
  • 打赏
  • 举报
回复
例1,只有1步,百分比为100%
所以用len=100/10000000得到步长,再通过l计算百分比
for n=0 to 10000000
n=n+1
l=l+len
next
aiur2000 2005-03-23
  • 打赏
  • 举报
回复
看过很多别人写的程序,都是先自己定义每个操作的百分比,就行了
cnapc 2005-03-23
  • 打赏
  • 举报
回复
ADO中有一个事件:FetchProgress (RecordsetEvent) 方法


该方法在长时间的异步操作期间定期调用,以便报告当前已经恢复(获取)到 Recordset 中的行的数目。

语法

FetchProgress Progress, MaxProgress, adStatus, pRecordset

参数

Progress 长整型,当前已经恢复的记录数。

MaxProgress 长整型,可能恢复的最大记录数。

adStatus EventStatusEnum 状态值。

pRecordset Recordset 对象,正在恢复记录的对象。
老汉 2005-03-23
  • 打赏
  • 举报
回复
自己做一个fmrmessage窗体;
在后台操作的时候,把他模式显示出来;这样就避免了用户取消后台操作的执行。
Hassle 2005-03-23
  • 打赏
  • 举报
回复
msgbox rs.RecordCount

rs.MoveLast

msgbox rs.RecordCount

ProgressBar1.Max = rs.RecordCount

rs.MoveFirst
coollele 2005-03-23
  • 打赏
  • 举报
回复
rs.Open sql, conn, adOpenDynamic, adLockBatchOptimistic
If Not rs.EOF Then
Set DataGrid1.DataSource = rs
DataGrid1.Refresh
Else
当程序在执行上面set datagrid1.datasource=rs 这里 时就会停顿好几下秒钟啊。。。
后面的While Not rs.EOF可以不用
Hassle 2005-03-23
  • 打赏
  • 举报
回复
ProgressBar1.Max = rs.recordcount
ProgressBar1.Min = 0
ProgressBar1.Value = 0
While Not rs.EOF
N = N + rs!库存
N1 = CDec(N1) + CDec(rs!库存 * rs!零价)
rs.MoveNext
ProgressBar1.Value = ProgressBar1.Value + 1
Wend
coollele 2005-03-23
  • 打赏
  • 举报
回复
楼上,能否将例2讲详细些呢

谢谢!!

7,785

社区成员

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

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