如何查询得到刚更新的数据?

Leaveye 2005-03-11 04:52:29
大概是这样的:
do
查询某表某字段,得到一个字符串

处理改字符串,得到更新语句

call conn.execute(更新语句)
loop

问题是,某次更新的数据会是之后某次要查询的,这种情况下,查到的却只是更新前的值。。~

这样的结果是,循环之后,只有对该数据的最后一次更新有效。

请问,如何查询得到刚更新的数据?
...全文
879 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leaveye 2005-03-12
  • 打赏
  • 举报
回复
真是辛苦大侠了。
只是,我为此改了许多种模式。仍然只是看到更改前的数据。


'连接串 = "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

效果依旧。。我该怎么办呢??
Leaveye 2005-03-12
  • 打赏
  • 举报
回复
Option Explicit
'处理 StrWorkOn:
'简化了字符串的处理,只是简单地加个前置标记。
'此处实际使用的代码完全是对字符串进行处理的过程,结果失败。
'却在这个简缩的版本中(当然,换了数据库表)能够正常工作。

#Const DebugHalt = 0
#Const DebugViewTraceInfo = 1

Private 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=maintepc;" & _
"Data Source=lsc;" & _
"User ID=sa;" & _
"Password=tepc1;" & _
"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
zjcxc 2005-03-12
  • 打赏
  • 举报
回复
有点不明白,你给的片断是在循环中打开和关闭recordset,更新用单独的sql,应该是可以的,建议你给个完整的测试出来
Leaveye 2005-03-12
  • 打赏
  • 举报
回复
现在实际问题已经解决,方法是查询字段的结果集也用于更新操作。就是打开 tmpRs 后不立即关闭,并用它进行更新操作。
但具体造成这种更新不即时可见的原因还不清楚。
另外。虽然对字符串的处理操作中不需要访问数据库,但在此处,数据库字段可见是比较危险的。或许后续工作会推出这个分析处理字符串的部分为独立的方法。
zjcxc 2005-03-11
  • 打赏
  • 举报
回复
测试结果也是
1 a
2 a
3 a
zjcxc 2005-03-11
  • 打赏
  • 举报
回复
'我在VB中用如下代码测试是可以得到更新后的数据

Sub test()
Dim Db As Object
Dim Rs As Object

'创建对象
Set Db = CreateObject("ADODB.Connection")
Set Rs = CreateObject("ADODB.Recordset")

'连接sql服务器
Db.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb"

'创建一个测试表
Db.Execute "create table ##(id int ,b varchar(10))" & vbCrLf & _
"insert ## select 1,'a'" & vbCrLf & _
"union all select 2,'b'" & vbCrLf & _
"union all select 3,'c'"

'打开表进行更新处理
Rs.Open "##", Db, 2, 3
While Rs.EOF = False
Debug.Print Rs(0) & vbTab & Rs(1)
'更新要取的数据
Db.Execute "update ## set b='" & Rs(1) & "' where id=" & Rs(0) + 1
Rs.MoveNext
Wend

'关闭对象
Rs.Close
Db.Execute "drop table ##"
Db.Close
Set Rs = Nothing
Set Db = Nothing
End Sub
mpshun 2005-03-11
  • 打赏
  • 举报
回复
同意老大的看法,在数据库中完成,取得结果才是最有效/最快速的的方法.
zjcxc 2005-03-11
  • 打赏
  • 举报
回复
如果不存在处理过程中,经常与程序、用户交互的问题,一般数据库处理相信在数据库中可以直接完成
flyingZFX 2005-03-11
  • 打赏
  • 举报
回复
呵呵,楼主说的是在 VB的程序里,使用ADO
Leaveye 2005-03-11
  • 打赏
  • 举报
回复
多谢大侠的建议。
虽然数据库中的读写功能是足以了,但它对字段内容的分析的支持与我的需要不太符合,所以自己实现了一些处理手段,这样,就被迫性的需要在程序中实现这个功能了。
xluzhong 2005-03-11
  • 打赏
  • 举报
回复
up
zjcxc 2005-03-11
  • 打赏
  • 举报
回复
--数据库中好处理

--示例数据
create table tb(id int identity primary key,b varchar(10))
insert tb select 'a'
union all select 'b'
union all select 'c'
go

--游标处理
declare tb cursor scroll for
select id,b from tb
declare @id int,@b varchar(10)
open tb
fetch tb into @id,@b
while @@fetch_status=0
begin
select @id,@b
update tb set b=@b where id=@id+1
fetch tb into @id,@b
end
close tb
deallocate tb
go

--删除测试
drop table tb

/*--结果

----------- ----------
1 a

(所影响的行数为 1 行)


(所影响的行数为 1 行)


----------- ----------
2 a

(所影响的行数为 1 行)


(所影响的行数为 1 行)


----------- ----------
3 a

(所影响的行数为 1 行)

--*/
Softlee81307 2005-03-11
  • 打赏
  • 举报
回复
up
laomai 2005-03-11
  • 打赏
  • 举报
回复
1楼?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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