如果我的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中,有没有可能做个进度条,让操作者知道要等多久。
...全文
211 点赞 收藏 15
写回复
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讲详细些呢

谢谢!!
回复 点赞
发动态
发帖子
VB基础类
创建于2007-09-28

2748

社区成员

19.7w+

社区内容

VB 基础类
社区公告
暂无公告