大概是这样的:
do
查询某表某字段,得到一个字符串
处理改字符串,得到更新语句
call conn.execute(更新语句)
loop问题是,某次更新的数据会是之后某次要查询的,这种情况下,查到的却只是更新前的值。。~ 这样的结果是,循环之后,只有对该数据的最后一次更新有效。请问,如何查询得到刚更新的数据?
do
查询某表某字段,得到一个字符串
处理改字符串,得到更新语句
call conn.execute(更新语句)
loop问题是,某次更新的数据会是之后某次要查询的,这种情况下,查到的却只是更新前的值。。~ 这样的结果是,循环之后,只有对该数据的最后一次更新有效。请问,如何查询得到刚更新的数据?
rs.AddNew rs.Fields("xx") = yy
rs.Fields("xx") = yy
rs.Fields("xx") = yy
rs.Fields("xx") = yy
rs.Fields("xx") = yy rs.Update
Next
查询某表某字段,得到一个字符串
处理改字符串,得到更新语句
call conn.execute(更新语句)
rs.Requery
loop
'连接串 = "Provider=SQLOLEDB.1;" & _
"Persist Security Info=False;" & _
"Initial Catalog=mainDB;" & _
"Data Source=" & CmbServer.Text & ";" & _
"User ID=" & TxtUserName.Text & ";" & _
"Password=" & TxtPassword.Text & ";"
Do
ColName = tmpArray(0)
Set tmpRs = New ADODB.Recordset
tmpRs.Source = 一个拼接得到的 SELECT 语句
tmpRs.CursorLocation = adUseClient '此处也尝试了服务端的游标。
tmpRs.Open , Conn, adOpenDynamic, adLockOptimistic, adCmdText
'此处尝试了所有的 CursorType ,分别尝试了权限最为开放的两个 LockType 。
If tmpRs.State = adStateClosed Then Exit Do
If tmpRs.RecordCount = 0 Then tmpRs.Close: Exit Do
If Not tmpRs.BOF Then tmpRs.MoveFirst
StrWorkOn = tmpRs(0) '目的就是为了取得目标字段的字符串放进这个变量。
tmpRs.Close
Set tmpRs = Nothing
'---------------------
'此处处理 StrWorkOn 。
'---------------------
Conn.Execute 一个拼接得到的 UPDATE 语句
'进行循环增量处理,也因此得到新的用于拼接的片断
Loop效果依旧。。我该怎么办呢??
'处理 StrWorkOn:
'简化了字符串的处理,只是简单地加个前置标记。
'此处实际使用的代码完全是对字符串进行处理的过程,结果失败。
'却在这个简缩的版本中(当然,换了数据库表)能够正常工作。#Const DebugHalt = 0
#Const DebugViewTraceInfo = 1Private Sub Main()
Dim Conn As New ADODB.Connection
Dim Rs As New ADODB.Recordset, tmpRs As ADODB.Recordset
Dim I As Long, CurLangID As Long, YWID As Long
Dim ColName As String, StrWorkOn As String, SQLStr As String
Const RecCount = 5
Conn.ConnectionString = "Provider=SQLOLEDB.1;" & _
"Persist Security Info=False;" & _
"Initial Catalog=aa;" & _
"Data Source=abc;" & _
"User ID=;" & _
"Password=;" & _
"Prompt=Complete"
Conn.Open
'这两个是运行时的参数。
CurLangID = 1033
YWID = 864
'建对象
SQLStr = "create table LocateTable (" & vbCrLf _
& " Idx int not null identity(1, 1)" & vbCrLf _
& " ,TblID int not null" & vbCrLf _
& " ,WhereClause varchar(200) not null" & vbCrLf _
& ")" & vbCrLf
Conn.Execute SQLStr
SQLStr = "create table TargetTable (" & vbCrLf _
& " Idx int not null identity(1, 1)" & vbCrLf _
& " ,Content varchar(100) null" & vbCrLf _
& ")" & vbCrLf
Conn.Execute SQLStr
'初始化数据
For I = 1 To RecCount
Conn.Execute "insert into TargetTable (Content) values('[Beginning]')"
Next
For I = 1 To 4 * RecCount
Conn.Execute "insert into LocateTable (TblID, WhereClause) " & vbCrLf _
& "values(object_id('TargetTable'), 'WHERE Idx = " & CStr(I Mod RecCount + 1) & "') "
Next
'读取定位信息
Rs.Source = "SELECT WhereClause, object_name(TblID) AS TblName FROM LocateTable a "
Rs.CursorLocation = adUseClient
Rs.Open , Conn, adOpenForwardOnly, adLockReadOnly, adCmdText
If Rs.State = adStateClosed Then GoTo EndOfSubMain
If Rs.RecordCount = 0 Then Rs.Close: GoTo EndOfSubMain
If Not Rs.BOF Then Rs.MoveFirst
I = 0
'分析并写入
Do While Not Rs.EOF
'查:
'这里和我实际使用的代码没有任何操作上的区别
ColName = "Content"
Set tmpRs = New ADODB.Recordset
tmpRs.Source = "SELECT " & ColName & " " & vbCrLf _
& "FROM " & Rs("TblName") & " " & vbCrLf _
& Rs("WhereClause") & " "
tmpRs.CursorLocation = adUseClient
tmpRs.Open , Conn, adOpenDynamic, adLockOptimistic, adCmdText
If tmpRs.State = adStateClosed Then Exit Do
If tmpRs.RecordCount = 0 Then tmpRs.Close: Exit Do
If Not tmpRs.BOF Then tmpRs.MoveFirst
StrWorkOn = tmpRs(0)
tmpRs.Close
Set tmpRs = Nothing
'处理 StrWorkOn:
'简化了字符串的处理,只是简单地加个前置标记。
'此处实际使用的代码完全是对字符串进行处理的过程,结果失败。
'却在这个简缩的版本中(当然,换了数据库表)能够正常工作。
StrWorkOn = "(" & I & ");" & StrWorkOn
'回写:
'这里和我实际使用的代码没有任何操作上的区别
SQLStr = "UPDATE " & Rs("TblName") & " " & vbCrLf _
& "SET [" & ColName & "] = '" _
& Replace(StrWorkOn, "'", "''") _
& "'" & vbCrLf _
& Rs("WhereClause")
#If DebugViewTraceInfo Then
Debug.Print String(40, "-")
Debug.Print "[Update Source:]"
Debug.Print SQLStr
#If DebugHalt Then
Debug.Assert False
#End If
#End If
'Call Conn.BeginTrans
Call Conn.Execute(SQLStr)
'Call Conn.CommitTrans
I = I + 1
Rs.MoveNext
Loop
Rs.Close
'查看结果
Debug.Print String(60, "=")
Debug.Print "[Result]"
Debug.Print "Idx", "Content"
Rs.Source = "select * from TargetTable"
Rs.Open , Conn, adOpenForwardOnly, adLockReadOnly, adCmdText
If Not Rs.BOF Then Rs.MoveFirst
Do While Not Rs.EOF
Debug.Print Rs("Idx"), Rs("Content")
Rs.MoveNext
Loop
EndOfSubMain:
'回收
Conn.Execute "drop table LocateTable"
Conn.Execute "drop table TargetTable"
Rs.Close
Conn.Close
End Sub
但具体造成这种更新不即时可见的原因还不清楚。
另外。虽然对字符串的处理操作中不需要访问数据库,但在此处,数据库字段可见是比较危险的。或许后续工作会推出这个分析处理字符串的部分为独立的方法。
获取那个更新值?
另一个原因是我需要对该值进行一个指定的处理过程。这个处理的方法实现,在数据库层次比较辛苦。不易调试。