5-8万条数据写入数据库中,时间很长,于是搞个计时器显示操作的时刻(从0计算起),让用户不至于放弃.但是,大量数据写入数据库操作时整个程序界面象是死机,计时器的变化不显示,或者偶尔显示一下,等操作完了计时器就一下子跳到结束的时刻了,这样计时器就失去了意义,请问有什么办法能解决这个问题,以下是我[写入]按钮的部分代码!执行到{rs.UpdateBatch '保存}该语句时象是死机!(虽然数据保存了)
      
      Timer1.Enable=True
      ...
      ...
      DoEvents 
      For i = 0 To UBound(rsArray) - 1  '循环
        fdArray = Split(rsArray(i), ",")
          rs.AddNew
          rs(0).Value = Trim(fdArray(0))
          rs(1).Value = Trim(fdArray(1))
          rs(2).Value = Trim(fdArray(2))
          rs(3).Value = Trim(fdArray(3))
          rs(4).Value = Zm
          rs(5).Value = Csrq
          ProgressBar1.Value = ProgressBar1.Value + 1
      Next i
      lblTag.Caption = "数据保存中,请稍候...计时器:"& CStr(jsq)
      Text3.Text = Text3.Text & vbCrLf & Time & " records:" & UBound(rsArray) & "  数据进入开关量表中."
      rs.UpdateBatch '保存
      ...
      ...
      MsgBox "数据处理完毕..."
      ProgressBar1.Value = 0
      Timer1.Enable=False

解决方案 »

  1.   

    ....你写一次UPDATA一次,你可以在写一个进度条
    for ...
    rs.addnew
       ...
    rs.update
    next
      

  2.   

    to  blackbug119(黑虫子) :
    没有用是一样的!我开始的时候,就没有考虑用计时器,直接就用进度条,将UPDATA写在for ...Next中,但变成了进度条的变化不显示,或者偶尔显示一下,等操作完了进度条就一下子跳到最后!
      

  3.   

    DoEvents
    写到FOR里面来就好了,不过这样速度慢好多
    Timer1.Enable=True
          ...
          ...
          DoEvents 
          For i = 0 To UBound(rsArray) - 1  '循环
            fdArray = Split(rsArray(i), ",")
              DoEvents
              rs.AddNew
              rs(0).Value = Trim(fdArray(0))
              rs(1).Value = Trim(fdArray(1))
              rs(2).Value = Trim(fdArray(2))
              rs(3).Value = Trim(fdArray(3))
              rs(4).Value = Zm
              rs(5).Value = Csrq
              ProgressBar1.Value = ProgressBar1.Value + 1
          Next i
          lblTag.Caption = "数据保存中,请稍候...计时器:"& CStr(jsq)
          Text3.Text = Text3.Text & vbCrLf & Time & " records:" & UBound(rsArray) & "  数据进入开关量表中."
          rs.UpdateBatch '保存
          ...
          ...
          MsgBox "数据处理完毕..."
          ProgressBar1.Value = 0
          Timer1.Enable=False
      

  4.   

    在界面上放一个 Label lblTime 用来显示时间Dim dtStart As DatedtStart = Now()
    For ...
      rs.AddNew
      ...
      rs.Update  lblDate = CDate(Now() - dtStart)
      DoEvents
    Next
      

  5.   

    啊哦,上面第一个DoEvents 多写了,复制过来忘去掉了:)
      

  6.   

    在进度条前加一下DoEvents会好一些,但update时的确是一个很长的延迟,也没有好的办法。
      

  7.   

    For i = 0 To UBound(rsArray) - 1  '循环
            fdArray = Split(rsArray(i), ",")
              rs.AddNew
              rs(0).Value = Trim(fdArray(0))
              rs(1).Value = Trim(fdArray(1))
              rs(2).Value = Trim(fdArray(2))
              rs(3).Value = Trim(fdArray(3))
              rs(4).Value = Zm
              rs(5).Value = Csrq
              ProgressBar1.Value = ProgressBar1.Value + 1
              ProgressBar1.Refresh
              DoEvents
          Next i
      

  8.   

    无论用进度条还是标签来显示进度,关键是要给系统足够的时间重画界面。在重新设置显示部件后,执行 Refresh 语句强制重画,或者加 DoEvents 让系统执行代码以外的事情(例如界面显示的更新)。
      

  9.   

    ...那是进度条没刷新的问题,你可以加一个刷新
    Refresh 重写一下试试
      

  10.   

    DoEvents '用DoEvents转让控制权
          For i = 0 To UBound(rsArray) - 1  '循环
            fdArray = Split(rsArray(i), ",")
              rs.AddNew
              rs(0).Value = Trim(fdArray(0))
              rs(1).Value = Trim(fdArray(1))
              rs(2).Value = Trim(fdArray(2))
              rs(3).Value = Trim(fdArray(3))
              rs(4).Value = Zm
              rs(5).Value = Csrq
              rs.UpdateBatch
              lblTag.Caption = "数据保存中...:" & UBound(rsArray) - 1 - i
              lblTag.Refresh
              ProgressBar1.Value = ProgressBar1.Value + 1
              ProgressBar1.Refresh
          Next ilblTag和ProgressBar1都要刷新!
    至于时刻问题:
    在[写入]按钮Dim a As Date
    Dim b As Date
    a = Time  '起始时刻
    ...
    ...'这里为上面的代码
    ...
    b = Time  '结束时刻
        lblTag.Caption = "工作完毕,耗时:" & Hour(b) - Hour(a) & "时" & Minute(b) - Minute(a) & "分" & Second(b) - Second(a) & "秒"
        MsgBox "数据处理完毕..."
        ProgressBar1.Value = 0
      

  11.   

    i = 1
        n = 0
        Do While Not DataRs.EOF
            i = i + 1
            If i = 500 Then
                n = n + 1
                i = 1
                Label1.Caption = n
                DoEvents
            End If
            DataRs.MoveNext
        Loop
    这样速度会快一些