回 帖 发 新 帖 刷新版面

主题:求助:ADO-ACCESS编程,Recordset没来的及更新完毕就再次读取,读不到最新数据.

代码:
---------------------
      .................
      ....................
    for i=1 to 10 
        Call Hydro           '此过程更新rs6所在数据表    且在Hydro中编辑rs6时使用 悲观锁定
                 
        rs6.Open "select * from Simu_Section ", cn, adOpenKeyset, adLockReadOnly
            
           '读取rs6中数据到rs7
            rs7.Fields("ccc") = rs6.Fields("CTail") '  rs7.RecordCount = rs6.RecordCount
            rs7.MoveNext
            rs6.MoveNext
            
        rs6.Close: Set rs6 = Nothing
   next i
     ...........................
     ...............................
------------------------------

问题:(1)  rs6的数据随着for循环在变,但是读取到rs7中的数据却总是相同(rs6的第一个版本)。为什么????
      (2)  在  rs6.Open "select * from Simu_Section ", cn, adOpenKeyset, adLockReadOnly  设置断点。每次运行到此,就等待几秒再继续,这样程序就正常。为什么?  是不是在这几秒内,rs6数据更新完毕了,所以可以读取到最新数据?
     (3) 这种问题的解决方法?

回复列表 (共4个回复)

沙发

1,每次的for循环都对rs6进行了“初始化”(rs6.open...),所以下面的rs6.movenext是起不到期望的作用的。故此,每次rs6.open...都得到了更新的数据,但记录指针却总是在open之后放在rs6的首位,当然rs7总是得到相同的数据了;
2,每次都Open,这是需要时间的!
3,你这样写思路上...有点看不太懂,但你可以把open放在for之外。

板凳

谢谢楼上! 
不好意思,我把一个循环给省了,原版是这样的

For j = 1 To rs6.RecordCount 
       rs7.Fields("ccc") = rs6.Fields("CTail")
            rs7.MoveNext
            rs6.MoveNext                
Next j

所以……  不过即使每次读的都是rs6第二条,那也应该有变化的,因为在 call Hydro后rs6就变化了。  所以问题依然是-- rs没有6真正更新完毕(完全写入表中而不是停留在内存中) 就又重新读取rs6表,所以读取的并不是期望数据。
===========================================
我在网上搜索了一下——这个问题确实存在的。(不知道是系统还是程序的问题)。

http://topic.csdn.net/u/20080108/17/af6025bc-bd11-46a0-9f6e-b28a0d78cfe6.html

以上是链接,并且含有解决办法。但我总觉得还应该有更好的方法。

3 楼

我试过了,更新没问题呀!
Dim cn As ADODB.Connection
Dim rs6 As ADODB.Recordset
Dim rs7 As ADODB.Recordset
Dim m_Va As Integer

Sub Hydro()
m_Va = m_Va + 1
Set rs6 = New ADODB.Recordset
rs6.Open "select * from Simu_Section ", cn, adOpenKeyset, adLockPessimistic
rs6.AddNew
rs6.Fields("CTail") = CStr(m_Va)
rs6.Update
rs6.Close
End Sub

Private Sub Command1_Click()
Dim i As Integer, j As Integer

   For i = 1 To 10
        Call Hydro           '此过程更新rs6所在数据表    且在Hydro中编辑rs6时使用 悲观锁定
                 
        rs6.Open "select * from Simu_Section ", cn, adOpenKeyset, adLockReadOnly
            
        For j = 1 To rs6.RecordCount '读取rs6中数据到rs7
            rs7.AddNew
            rs7.Fields("ccc") = rs6.Fields("CTail") '  rs7.RecordCount = rs6.RecordCount
            rs7.Update
            'rs7.MoveNext
            rs6.MoveNext
        Next j
        rs6.Close: Set rs6 = Nothing
   Next i
rs7.Close
rs7.Open "select * from Simu_Section_ccc", cn, adOpenKeyset, adLockOptimistic
Set Adodc1.Recordset = rs7
Adodc1.Refresh
Adodc1.Recordset.MoveLast
DataGrid1.Refresh
End Sub

Private Sub Form_Load()
Set cn = New ADODB.Connection
Set rs6 = New ADODB.Recordset
Set rs7 = New ADODB.Recordset
cn.ConnectionString = "Provider=MSDASQL.1;Password=;Persist Security Info=False;User ID=管理员;" _
    & "Extended Properties=""DBQ=d:\temp\abcd.mdb;DefaultDir=" & App.Path & "\;Driver={Microsoft Access Driver (*.mdb)};" _
    & "DriverId=25;FIL=MS Access;FILEDSN=;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;" _
    & "SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"""
cn.Open
rs7.Open "select * from Simu_Section_ccc", cn, adOpenKeyset, adLockOptimistic

End Sub

Private Sub Form_Unload(Cancel As Integer)
Set rs6 = Nothing
Set rs7 = Nothing
cn.Close
End Sub

4 楼

多谢楼上! 理论上都应该是没有问题的,呵呵…… 现在想想,如果有问题的话,肯定就是出在
Sub Hydro()  里了。我的这个Sub Hydro()是另一个Module中的一个 public sub Hydro(),并且对rs6数据所做的操作有可能导致我现在的问题(不过只要让程序“慢”下来就没有问题的)——这就应该是问题所在了吧。


不过我认为——就像我给出了链接所指出的,这个问题确实是存在的。——比如说,已经成功运行了rs6.Update ,但其实数据表里面并没有真正写入rs6的数据(需要消耗系统一定的时间写入的)。——也许,我们都被VB的  Recordset.Update 功能骗了(至少跟教科书上写的是有一定出入的)——不过这就属于纯粹瞎猜了,呵呵……


结贴!

我来回复

您尚未登录,请登录后再回复。点此登录或注册