VB6.0 如何使用ADO控件进行多表级联更新(最佳答案者追加20分)

有两张表:

表A:
字段“编号”的记录:1 2 3 4 5 ;
字段“姓名”的记录:张三 李四 王五 胡六 孙七;
表A中的编号和姓名是一一对应的。

表B:
字段“编号”的记录:1 2 3 4 5 ;
字段“姓名”的记录集为空。

请问如何使用ADO1控件来更新表B中姓名字段的内容,即表B中编号2对应表A中的姓名李四。

注:功能我已实现,但是两张表的记录数都为1000,表B内容更新速度过于缓慢。
dim bid(1000)
dim aname(1000)
dim i as integer
i=0
ado1.RecordSource = "select * from B"
ado1.Refresh
While Not ado1.Recordset.EOF()
bid(i)=ado1.Recordset.Fields("编号")
i++
ado1.Recordset.MoveNext
Wend
ado1.Recordset.Close
For i= 0 To UBound(bid) - 1
ado1.RecordSource = "select * from A where 编号 = " + """" + bid(i) + """"
ado1.Refresh
If ado1.Recordset.EOF = False Then
aname(i) = ado1.Recordset.Fields("姓名")
Else
aname(i) = "姓名不详"
End If
Next
ado1.Recordset.Close
ado1.RecordSource = "select * from B"
ado1.Refresh
While Not ado1.Recordset.EOF()
ado1.Recordset.Delete
ado1.Recordset.MoveNext
Wend
ado1.Recordset.Close

ado1.RecordSource = "select * from B"
ado1.Refresh
For i= 0 To UBound(bid) - 1
ado1.Recordset.AddNew
ado1.Recordset.Fields("姓名") = aname(i)
ado1.Recordset.Fields("编号") = bid(i)
ado1.Recordset.Update
Next
ado1.Recordset.Close

不建议使用ADO控件进行数据编程
建议使用ADODB对像

你上面的问题解决方法
1:工程-引用-microsoft ActiveX data objects 2.X
代码
Dim conn As New ADODB.Connection
conn.Open Connstring
conn.Execute "update A set A.姓名=isnull(B.姓名,'无此姓名') from 表二 A left join 表一 B on A.编号=B.编号"
conn.Close

完成
其中Connstring设置为你ADODB控件的连接字符串即可,
1000数据可以在几秒内完成修改,具体时间看你数据服务器配置状态
楼上的删除再插入方法,处理速度先不讨论,但是会破坏表二里面的原有数据条目,如果表二里有表一中没有的数据,那么不建议使用楼上的方法
如表二里有10条记录.表一里只有5条,那么根据他的方法,更新后表二只会有5条记录存在
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-14
想问一下为什么一定要用ADO1控件?

简单的作法:
dim conn as adodb.connection
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & ("\my.mdb")
conn.Execute ("delete * from b") '删除表B的数据
conn.Execute ("insert into b select 编号,姓名 from A") '将表A的数据复制到表B
set conn = nothing

这个就不管你有多少条记录了,反正表B与表A肯定是相同的编码和姓名追问

这个方法对于两张表中记录数相同的情况下适用。如果表B的记录数为5个,表A的记录为10个,表B的姓名记录应该更新5条,但是这样的话,表B会直接把表A的10条姓名记录全部复制过来。

第2个回答  2012-08-13
请问你说,你的功能已经实现,代码贴上来看看,你用的难道是读取A表"编号",然后在B表从头到底用MoveNext一一匹配?
我试验了,1000条记录,不会超过10秒钟!追问

我出去有点儿事情,回头代码发出来。

追答

呵呵!
我的代码,你试一下,能否满足你的要求。
用到2个ADODC控件,adodc1连接A表(编号,姓名都有数据),adodc2连接B表(只有编号数据,姓名数据为空)。
Adodc1.Refresh
Adodc1.Recordset.MoveFirst
Do While Not Adodc1.Recordset.EOF
Adodc2.Refresh
Adodc2.Recordset.Find "编号='" & Adodc1.Recordset.Fields("编号") & "'"
If Not (Adodc2.Recordset.EOF And Adodc2.Recordset.BOF) Then
Adodc2.Recordset.Fields("姓名") = Adodc1.Recordset.Fields("姓名")
Adodc2.Recordset.Update
End If
Adodc1.Recordset.MoveNext
Loop

追问

这就是我想要的代码,谢谢。
考虑到第二个表跟第一个表的记录数不一致,我额外新加了一段:
Adodc1.Refresh
Adodc1.Recordset.MoveFirst
Do While Not Adodc1.Recordset.EOF
Adodc2.Refresh
Adodc2.Recordset.Find "编号='" & Adodc1.Recordset.Fields("编号") & "'"
If Adodc2.Recordset.EOF Then
MsgBox ("数据更新完毕。")
Exit Do
End If

追答

如果A表与B表记录数不一致,这样改就更有问题了!
假设A表有编号:
999
1
2
3
B表有编号:
1
2
你这样一来,结果编号1和2并没有把姓名添加过去?因为地1个编号999就没找到,就结束了!!!!!!

本回答被提问者和网友采纳
第3个回答  2012-08-13
复制表追问

复制表的时间是1分钟,这个程序用来天天都要更新数据,那么一年会要花费365分钟的时间去复制表。

VB6.0 如何使用ADO控件进行多表级联更新(最佳答案者追加20分)
1:工程-引用-microsoft ActiveX data objects 2.X 代码 Dim conn As New ADODB.Connection conn.Open Connstring conn.Execute "update A set A.姓名=isnull(B.姓名,'无此姓名') from 表二 A left join 表一 B on A.编号=B.编号"conn.Close 完成 其中Connstring设置为你ADODB控件的连接字...

请问Parameter对象的具体含义和作用是怎么样的?
·将数据字段的数值传递给数据绑定控件,可以在这些控件中显示或更改这些数值。 ·添加新的记录,或根据更改显示在绑定的控件中的数据来更新一个数据库。 2、数据库的连接 数据库的连接可通过ADO控件实现,为此,必须在工程部件中选择Microsoft ADO Data Control 6.0 (OLEDB),然后在窗体中添加ADO控件。利用ADO连接数据库...

相似回答