资源描述
ActiveX数据对象
ActiveX数据对象
一. 用ActiveX数据对象创建Visual BasiC应用程序 3
1. 理解OLE DB/ADO结构 4
2. 在Visual Basic应用程序中安装和创建对ADO的引用 6
3. 使用ADO的Connection对象连接到某数据源 7
(1). 指定OLE DB提供者和连接字符串 8
(2). 用临时表工作 9
(3). 决定提供者所支持的临时表和其他功能 11
(4). 在ADO编程时使用VB的智能化功能 12
(5). ADO中的记录锁 12
(6). 打开和关闭到某数据源的连接 13
4. 使用ADO Recordset对象来操作数据 14
5. 利用Recordset对象插入和更新记录 17
6. 创建无连接记录集 22
7. 使用ADO Command和Parameter对象执行查询 28
8. 利用ADO的Field对象访问记录集数据 30
9. 利用ADO的Errors集合处理错误 31
10. 利用Propemes集合查看提供者指定的属性 32
二. 数据访问 34
1. 用Field对象操作字段 34
(1). 对Field对象的引用 35
(2). 复制一个字段 36
(3). 将整个记录复制到数组中 36
2. 结合Recordset对象使用定位方法 41
(1). 使用BOF和EOF遍历记录集 42
(2). 使用BOF和EOF来确定一个记录集是否为空 44
(3). 使用RecordCount属性来确定记录集中记录的条数 44
(4). 当前记录在记录集中的位置 45
(5). 改变记录的值 46
(6). 用AddNew 和Update方法创建新记录 47
(7). 用AppendChunk向Binary字段追加数据 50
(8). 用Close方法关闭Recordset 51
3. 搜索记录集和表中的数据 51
4. 使用Bookmark属性记录你在Recordset中的位置 54
在Visual Basic 6.0中,ActiveX Data Objects(ADO)占据着更重要的位置,并且功能更强大。你不仅仅可用ADO通过Web页面访问数据库,也可以用它从Visual Basic应用程序中获取你需要的数据。
ADO除了是数据库访问的另外一个对象模型外,还是一种新近出现的数据技术——OLE DB的面向对象接口。
OLE DB是用来替代ODBC的访问数据的方法。ODBC现在是普遍的访问关系列数据的Windows客户方标准,原因是它使关系数据库对于客户方应用程序尽可能地通用。OLE DB则尝试想更进—步,让所有的数据源都通用于客户方应用程序。
一. 用ActiveX数据对象创建Visual BasiC应用程序
Microsoft ActiveX Data Objects(ADO)是个类似于Data Access Objects(DAO)和Remote Data Objects(RDO)的面向对象的数据库访问技术。它是Microsoft的Universal Data Access的一部分,目的是让所有数据源看起来一样。
就象利用ODBC使所有关系型数据源通用一样。
提示 如想获得Microsoft的Universal Data Access的最新信息,可以下载包含ActiveX Data Objects的文件,你还可以查看 Access Components Web页面。如想了解有关ActiveX Data Objects更详细的信息,则可访问
ADO现在被Microsoft定位为一种从Web服务器访问数据库的技术。由于ADO是以ActiveX Server库的形式提供的(跟DAO及RDO一样),你完全可以在Visual BasiC应用程序中使用ADO。实际上,在许多方面,你将发现使用ADO能更容易地访问client/server应用程序。虽然ADO是一种较新的数据库访问技术,帜它的性能完全可以与RDO匹敌。
本文的第一部分着重介绍如何用ADO创建传统的Visual Basic应用程序,其中包括对ADO对象模型的讨论。
1. 理解OLE DB/ADO结构
大多数Visual Basic开发者从不直接与OLE DB打交道。相反地,他们编程时使用ADO,该对象模型提供对OLE DB的接口。它的结构在图1中介绍。
图1. 该图演示如何使用ADO和OLE DB访问数据库中信息的过程
注释 如果你理解数据“提供者”(Provider)这一概念有困难的话,你可以简单地认为它是“驱动程序”(driver)。当你把ODBC和OLE DB体系结构一起比较时,你会发现两者从角色角度来讲在概念上是相似的。
OLE DB提供者不象ODBC驱动程序那么多,但当ADO 2.0在1998年颁布后,OLE DB提供者的数目增长幅度很快。该ADO版本(已包含于VisualBasic 6.0中)包括SQL Server、Oracle和Microsoft Jet/Access天生的提供者。
你很有可能将能够使用ADO和OLE DB访问关系型数据源,即使它们没有天生的OLE DB提供者。那是因为ODBC关系数据库有一个通用的OLE DB提供者。该结构(看起来相当今人费解)将在图2中演示。
Microsoft已经说ADO主要用于Internet,具有在不经常重引导的服务器上同时服务大量用户的能力。在Web应用程序中使用ADO最简单的办法是用Active Server Page形式。
图2. 使用ODBC OLE Db提供者访问ODBC数据库的体系结构
由于你也可以通过应用程序或内置于Visual Basic的ActiveX组件中访问ADO,你也可以创建单一的途径来访问数据和可从Visual Basic中及Web应用程序中访问的商业逻辑。图3即演示了这种体系结构。
在这种情形下,所有与商业相关的逻辑处理均放在类模块中,并且以ActiveX组件的形式编译。这样一来,存在于客户方的代码量比较少。由于Web浏览器和VB应用程序的数据访问均通过ActiveX服务器,你可以确信程序逻辑始终一致,不管使用何种应用程序。
2. 在Visual Basic应用程序中安装和创建对ADO的引用
在你开始在Visual Basic应用程序中操作ADO之前,ADO必须已经女装在计算机上。ADO—般是Visual Basic 6.0正常安装的一部分。
注释 ADO是随着V1sual Basic 6.0一起安装的。如果想获得它的最新版本,你可以从Microsoft Web站点自由下载,地址为: Basic、Visual C++、Microsoft Office程序组和Active Server Pages Web脚本化。
图3. 该体系结构允许你在Web浏览器和Visual Basic客户应用程序中使用通用的ActiveX代码组件
如果ADO已经安装在计算机上,你可以在VB应用程序引用该ADO库。然后开始使用它, 就象引用DAO或RDO库一样。具体步骤如下:
1) 在Visual BaSic项目中,选择[工程]→[引用]。
2) 这时,“引用”对话框出现。
3) 选中Microsoft ActiveX Data ObJects 2.0 Library,然后单击“确定”。
现在你可以在代码中使用ADO了。
在项目中引用ADO库时,一定要确保你没有引用Microsoft ActiveX Date Objects 2.0 Recordset库。这是被设计用于client/server应用程序中客户方的早期ADO库版本。它只支持Recordset和Field对象。如果你发现自己不能在ADO应用程序中初始化Connection或Command对象的话,这可能就是原因所在。
3. 使用ADO的Connection对象连接到某数据源
在ActiveX Data Objects中,你可以使用Connection对象来建立到某数据源的连接。同时,正如后面示例代码所演示的那样,你不必使用Connection对象与ADO完成有益的工作——ADO的这一点比RDO优秀,而后者更依赖于Connection对象。
在ADO对象模则中,ADO Connection对象、属性和方法的地价如图4所示。
图4. 在ADO对象的上下文中,ADO Connection对象的属性和方法
你可以使用ADO Connection对象的Open力法建立与数据源的连接。为了告诉ADO如何去访问数据源,你必须以与ODBC连接字符串相同的格式提供有关信息。你可以使用Connection对象的ConnectionString属性来实现。你也可以通过设置Connection对象的Provider属性来选择你想使用的提供者。本文以下几节内容将给出如何实现这些的示范代码。
(1). 指定OLE DB提供者和连接字符串
你可以使用ADO Connection对象的Provider属性来指定OLE DB提供者。该属性告诉ADO将使用哪个OLE DB提供者来执行服务器命令(如果你没有指定提供者,或者你没有使用Connection对象,则你所用的是缺省提供者,该提供者是OLE DB的ODBC提供者,也称作MSDASQL)。
Connection对象的Provider属性是个文本字符串,其中该字符串被用于指明连接时使用哪个OLE DB提供者,原因是ODBC提供者是缺省的。然而.如果为了更明确的话,你可以指定它。
你在ADO中使用的ConnectionString可以提供有关如何与数据库服务器连接的信息。当你正在使用OLE DB的ODBC提供者时,该连接字符串与ODBC连接字符串—样。这意味着ODBC驱动程序期望的准确信息可以根据不同的实现而变化。对于其他提供者来说,连接字符串可能是完全不同的语法。
当你正在使用ODBC提供者时,ConnectionString属性可能是个数据源名称(DSN)或者DSN—Less连接。下面的例子即为使用带有DSN的ODBC提供者与数据库的连接:
cn.Provider = "MSDASQL"
cn.ConnectionString = "DSN=Novelty”
连接字符串中的DSN显然要求名称为Novelty的DSN必须真正存在于客户方的计算机上。
下面例子告诉Connection对象使用Microsoft Jet OLE DB提供者。对于Jet提供者,连接字符串是MDB文件的路径和文件名(使用Microsoft Access数据库)。
cn.Provider = "microsoft.jet.oledb.3.51"
cn.ConnectionString = "D:\novelty.mdb"
为了使用ADO和ODBC提供者连接到一个安全保护的数据库,你必须通过Connection对象的Properties集合提供额外的信息。这种信息通常包括用户名和口令。以下即为如何在ADO中设置这些值的例子:
cn.Provider = "MSDASQL"
cn.ConnectionString = "DSN=Novelty"
cn.Properties("Password") = ""
cn.Properties("User ID") = "sa"
cn.Open
为连接到SQL Server数据库,你应使用提供者SQLOLEDB.1:
cn.Provider = "SQLOLEDB.1"
cn.ConnectionString = _
"DATABASE=novelty;SERVER=toshiba;UID=sa;PWD=;"
或者
cn.ConnectionString = "DRIVER=Sql Server;DATABASE=novelty;_
SERVER=toshiba;UID=sa;PWD=;"
注意在这种情况下,SQL Server的连接字符串跟DSN-Less ODBC连接字符串相同,差别只在于DRIVER=参数;
为连接到Oracle,你应使用ORACLE驱动程序,名称为MSADORA:
cn.Provider = ”MSADORA”
cn.ConnectionString = ”user/mypass@servicename”
注意,对于Oracle驱动程序而言,连接字符串是个标准的Oracle连接字符串,其中包含有用户名、口令和服务器名称。你也可以通过向Connection对象的Open方法提供服务器、用户名和口令而登录到Oracle。
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Provider = "MSADORA"
cn.Open "SERVER","USERID","PASSWORD"
你也可以给Recordset对象的Open力法分配连接字符串,这—点将在本文后面内容“使用ADO Recordset对象操作数据”中介绍。
(2). 用临时表工作
就象在RDO和DAO中—样,ADO提供了对许多临时表类型的支持,包括同时定位记录集中某记录的支持,不同类型的临时表允许你控制如何管理记录集。
通过给Recordset对象的CursorLocation属性分配值,你可以设置临时表的位置。表1给出对ADO Connection对象有效的临时表类型。
表 1. ActiveX Data ObJects中有效的临时表类型
临时表类型
常 量
描 述
客户机端
adUseClient
在客户机端创建临时表
服务器端
AdUseServer
在服务器端创建临时表
选择客户方临时表意味着由ADO和OLE DB处理临时表操作。客户方临时表经常具有服务器端临时表所没有的功能。比如,在ADO中,你可以创建—个无连接的记录集,即允许你操作与服务器没有永久性连接的记录。该能力是客户方临时表库提供的功能。
在ADO中,CursorLocation属性适用于Recordset和Connection对象。如果你分配Connection对象的CursorLocation属性,则你从该连接创建的所有记录集与相关的Connection对象具有相同的临时表位置。
除指定临时表位置外,你还有能力用ADO创建四个不同类型的临时表。你对临时表的选择一般应本着均衡功能和性能的原则。
通过分配Recordset对象的CursorType属性,你可以指定一个临时表类型。表2列出的即为你可以用ADO创建的临时表类型。
表 2. 使用ADO Recordset对象时有效的临时表类型
临时表类型
常 量
描 述
Forward-only
adOpenForward
没有临时表——只能在记录集中往前移动;
MovePrevious和MoveFirst方法会产生错误。
Keyset
(在DAO中称作Dynaset)
dbOpenKeyset
你不能看到其他用户添加到记录集汇总的记录,但其他用户进行的更新和删除操作会影响记录集;可能是效率最高的临时表,尤其当记录集很大时更是如此。
Dynamic
dbOpenDynamic
当记录集处于打外状念时,你可以看到其他用户对数据所作的任何修改;这是效率最低,但功能最强的临时表。
Siatic
(在DAO中称作Snapshot)
dbOpenStatic
记录集中所有数据的一个拷贝;当你查找数据或者运行报告时尤其有用处;记录集很小时可能很有效。
当然,你选择Forward-only临时表,而不是Keyset或Dynamic临时表的理由是性能——如果你只想处理或打印存储在数据库中的数据项列表的话,Forward—only临时表就地够了,并且性能更好。
注意,如果数据提供者不能提供你期望的临时表类型,则它将创建它能创建的临时表类型。一般。它不会产生一个错误,除非你尝试做当前临时表禁止的事情(比如、对Forward-only临时表实施MovePrevious方法)。下—节内容将介绍每种提供者所支持的临时表。
(3). 决定提供者所支持的临时表和其他功能
由于OLE DB和ADO被设计用于访问多方面的数据源,所以应用程序可能需要了解特定提供者所支持的功能。可能会存在如下情况:企业关系型数据库管理系统或许允许你创建一个服务器端、Forward-only临时表,而桌面或基于文件的数据库却可能不能。
ADO Recordset对象的Supports方法决定某数据提供者所支持的游标。表3是你可以传递给Supports方法的有效值,以决定特定Recordset对象所支持的功能。
表 3. Support方法所使用的常量
常 量
描 述
adAddNew
新记录可以添加到记录集
adApproxPosition
AbsolutePage和AbsolutePosition属性有效;它们与Recordset对象的PageSize和PageCount属性一起使用,你可以依此决定当前记录所处的页面
addBookmark
可以在记录集中设置书签
adDelete
可以从记录集中删除记录
adHoldrecords
无须提交已有的更改,可以从数据库中查询记录
adMovePrevious
记录集可以向后滚动
adResync
adResync方法有效
adUpdate
记录集可以更改
adUpdatebatch
借助于UpdateBatch方法,记录集可以被成批处理。借助于批处理,你可以在一个操作中提文对多个记录的修改,这样就提高了客户机/服务器性能
比如,为了决定某数据提供者是否有能力提供—个滚动临时表,你可以使用如下表达式:
rs.Supports(adMovePrevious)
在此,rs是Recordset对象。如果表达式结果为Ture,则该数据提供者支持滚动临时表。
(4). 在ADO编程时使用VB的智能化功能
相对于其他数据库访问对象模型,ADO的一个优点是它的常量能被显式地罗列出来。对于VB开发者而育,这意味着当你在集成开发环境中编写代码时,你可以得到有关常量的下拉列表。
图5即为一例。如图所示,当你用ADO输入代码时,如果你想使用对象的方法或者决定哪个常量适宜时,你不必每次都按下F1寻求帮助,系统会自动地给出相关常量或方法的列表,你可以从中选择。
图5. 图中即ADO提供的极其有用的常量列表
考虑到在Visual Basic中该功能的普及性,对于一些开发者来说,自动呈现的下拉列表会让他更乐意采用ADO。
(5). ADO中的记录锁
象其他数据库访问对象模型一样,ADO允许你设置不同类型的记录锁方式。在控制多用户更新数据库中记录的情况下,可以设置适宜的锁。
你可以通过设置ADO Recordset的LockType属性设置锁方式。表4列出四种有效的记录锁。
表 4. ADO LockType属性有效的记录锁方式
常 量
描 述
adLockReadOnly
不允许对记求集作修改
adLockPessimistic
保守式锁。当记己录编辑开始时,该锁启动,记录集中该记录被锁住,并且锁会保持到你执行Update方法或者移到其他记录时才解除
adLockOptimistic
开放式锁。只有当你执行Update方法时或者移列其他记录的瞬间才启动锁,并且更改操作完成后立即解除
adLockBatchOptimistic
开放式批处理锁。对同时更新多个记录提供支持
你—定要认识到:ADO中缺省锁力式是adLockReadOnly。这是ADO和DAO编程间其中一个最重要的区别,因为在DAO中,缺省条件下记录集是可编辑的。这意味着如果你未曾设置LockType和CursorType属性的话,则ADO记录集将始终是只读的。
不同类型锁的有效性依赖于数据提供者的支持内容。借助于Recordset对象的Supports方法(本文前面已介绍),你可以决定提供者是否支持某特定类型的锁。
你也应当记住,ADO记录集可以与它们的数据源断开连接。这一点将在本文后面的“创建无连接的记录集”中讨论。
(6). 打开和关闭到某数据源的连接
为了使用ADO对数据源发送命令,你应打开到该数据源的连接。一般,你可以使用ADO Connection对象的Open方法来实现。当你完成对数据源的操作后,你应使用该Connection对象的Close办法来关闭之。下面即为ADO Connection对象Open方法的语法:
cn.Open[Connect],[userid],[password]
Open方法的所有参数都是可选的。如果你末给Open方法提供一个连接字符串作为参数的话,你可以通过Connection对象的ConnectionString属性来提供。效果是—样的。
连接字符串的语法是由提供者决定的。程序清单1中的例子是使用ADO Connection对象而打开到ODBC数据库的连接。
程序清单1. 使用ADO Connection对象而打开到数据源的连接
Option Explicit
'References ADO 2.O
Private cn As ADODB.Connection
Private Sub Form_Load()
Set cn = New Connection
cn.Open "PROVIDER=MSDASQL;DSN=Novelty;UID=sa;PWD=;"
End Sub
这段代码假设你已经在计算机上建立一个名为Novelty的ODBC数据源(DSN)。
当你操作完ADO Connection对象后,你应使用它的Close方法来关闭之;
Cn.Close
显式地关闭到数据源的连接可以保证任何与该连接相关的资源(在客户方或服务器上,或两者都有)都及时地得到释放。
4. 使用ADO Recordset对象来操作数据
ADO的Recordset对象,类似于DAO的Recordset和RDO的Recordset对象,是访问来自数据提供者的信息的方式。ADO的Recordset对象与其他对象模型的Recordset对象具有许多相同的属性和方法,所以你可以相同的方式处理。
ADO Recordset对象在ADO对象模型中的位置,以及它的属性和方法,你均可以在图6中看到。
创建ADO Recordset对象的过程很类似于创建RDO rdoResultset的过程。然而,、ADO有个很有趣的地方:有能力创建一个不需要隐式Connection对象的Recordset对象(这不同于拥有一个无连接记录集——连接确实存在,只是没有表示它的对象变量而已)。
举个例子,程序清单2演示了如何以传统方式创建—个ADO Recordset对象。该技术对于RDO程序员来说很熟悉——首先创建一个Connection对象,然后通过给该Connection对象的Exexute方法传递一个SQL查询而运行一个相对于连接的查询。
图6. 存在于ADO对象模型中ADO Recordset对象的属性和方法
程序清单2. 使用connection和Recordset对象创建一个ADO Recordset对象
Option Explicit
'References ADO 2.O
Private cn As ADODB.Connection
Private Sub cmdQueryCN_Click()
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Source = "select * " & _
"from tblCustomer " & _
"where State='DE' " & _
"order by Lastname,Firstname"
Set rs.ActiveConnection = cn
rs.Open
lstData.Clear
Do Until rs.EOF
lstData.AddItem rs.Fields("FirstName") & " " & _
rs.Fields("LastName") & "," & _
rs.Fields("Address")
rs.MoveNext
Loop
End Sub
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.Open "PROVIDER=MSDASQL;DSN=Novelty;UID=sa;PWD=;"
End Sub
Private Sub Form_Unload(Cancel As Integer)
cn.Close
Set cn = Nothing
End Sub
注释 创建ADO Recordset的命令字符串可能是表名、存储查询的名称或者SQL语句--它和DAO中OpenRecordset方法的运行方式相同。
作为该技术的替代,ADO允许你无需事先创建Connection对象就可创建Recordset对象。对于这一点,你可以通过给Recordset对象的Open方法传递一个连接字符串而实现。代码如程序清单3所示:
程序清单3. 无须首先创建一个ADO Connection对象,你就可以创建ADO Recordset对象
Option Explicit
'References ADO 2.O
Private rs As ADODB.Recordset
Private Sub cmdQueryRS_Click()
Set rs = New ADODB.Recordset
rs.Source = "select * " & _
"from tblCustomer " & _
"where State='DE' " & _
"order by Lastname,Firstname"
rs.Open , "PROVIDER=MSDASQL;DSN=Novelty;UID=sa;PWD=;"
lstData.Clear
Do Until rs.EOF
lstData.AddItem rs.Fields("FirstName") & " " & _
rs.Fields("LastName") & "," & _
rs.Fields("Address")
rs.MoveNext
Loop
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
Set rs = Nothing
End Sub
5. 利用Recordset对象插入和更新记录
在ADO中完成记录的插入和更新差不多跟在DA0中—样,为了插入一个记录,可以遵循以下步骤:
1) 打开—个记录集。
2) 执行该Recordset对象的AddNew方法。
3) 给Recordset对象中的字段分配值。
4) 通过执行该Recordset对象的Updata方法以保存该记录。
为了使用ADO Recordset对象更新已有的记录,可以遵循如下步骤:
1) 打开一个记录集。
2) 给该Recordset对象中的字段分配值(注意,当你在DAO中这样做时.你不必执行Recordset对象的Edit方法——ADO则不然)。
3) 通过执行该Recodset对象的Update方法以保存该记录。
演示输入和更新记录的应用程序允许用户首先把雇员数据放到—个列表框。然后选择一个特定雇员来编辑。当运行时,应用程序的外观类似于图7:
图7. 该比用秤序演示输入和电斯记录
程序清单4中为该应用程序的代码:
程序清单4. 利用ActiveX Data Objects更新记录
Option Explicit
' References ADO 2.0
Private cn As ADODB.Connection
Private mrsCust As ADODB.Recordset
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.ConnectionString = _
"PROVIDER=MSDASQL;DSN=Novelty;UID=sa;PWD=;"
cn.Open
Set mrsCust = New ADODB.Recordset
mrsCust.LockType = adLockOptimistic
mrsCust.CursorType = adOpenKeyset
End Sub
Private Sub cmdList_Click()
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Source = "select * " & _
"from tblCustomer " & _
"where State = 'DE' " & _
"order by LastName, FirstName"
Set rs.ActiveConnection = cn
rs.Open
lstData.Clear
Do Until rs.EOF
lstData.AddItem rs.Fields("FirstName") & " " & _
rs.Fields("LastName")
lstData.ItemData(lstData.NewIndex) = rs.Fields("ID")
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Private Sub lstData_Click()
Dim strSQL As String
strSQL = "select * " & _
"from tblCustomer " & _
"where ID = " & lstData.ItemData(lstData.ListIndex)
mrsCust.Source = strSQL
Set mrsCust.ActiveConnection = cn
mrsCust.Open
txtFirstName.Text = mrsCust.Fields("FirstName")
txtLastName.Text = mrsCust.Fields("LastName")
txtAddress.Text = mrsCust.Fields("Address")
txtCity.Text = mrsCust.Fields("City")
mrsCust.Close
End Sub
Private Sub cmdSave_Click()
Dim strSQL As String
strSQL = "select * " & _
"from tblCustomer " & _
"where ID = " & lstData.ItemData(lstData.ListIndex)
mrsCust.Source = strSQL
Set mrsCust.ActiveConnection = cn
mrsCust.Open
mrsCust.Fields("FirstName") = txtFirstName.Text
mrsCust.Fields("LastName") = txtLastName.Text
mrsCust.Fields("Address") = txtAddress.Text
mrsCust.Fields("City") = txtCity.Text
mrsCust.Update
mrsCust.Close
' Refresh list of customers
cmdList_Click
End Sub
Private Sub Form_Unload(Cancel As Integer)
cn.Close
Set cn = Nothing
End Sub
为了使用该应用程序,则运行它,然后单击“查看列表S”按拉以显示用户列表。当用户单击列表中某用户时,有关详细内容出现在文本框中。为了更新该记录。则只需修改某文本框中内容,然后单击“更新数据U”即可。
为了实施更新操作,“更新数据U”按钮Click事件中的代码重新查询数据,然后对之实施Update。在client/server环境下,这不是最有效的力式,但是当你使用Access数据库时,代码工作得很好(更有效率、但同时更复杂的实施
展开阅读全文