补充1:ADO对象编程
1.1ADO基础
1.1.1 ADO的介绍
ADO是ActiveX Data Object的缩写,它是Microsoft数据库应用程序开发的新接口,是Microsoft新的数据访问技术,是建立在OLE DB之上的高层数据库访问技术。
ADO被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal Data Access)。OLE DB是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象即使对OLE DB不了解也能轻松使用ADO,因为它非常简单易用,并不失灵活性。
ADO向VB程序员提供了很多好处,包括易于使用、熟悉的界面,高速度以及较低的内存占用。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立建立。因此可以只创建一个“Connection”对象,但是可以有多个,独立的“Recordset”对象来使用它,另外ADO针对客户/服务器以及Web应用程序作了优化。
ADO最基本的操作流程:初始化COM库,引入ADO库定义文件;用Connection对象连接数据库;利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理;使用完毕后关闭连接释放对象。
1.1.2 AD0的对象数据库连接对象——Connection
这是ADO的最大特点。每一次引用数据库可以建立一个连接对象,然后在其之上建立多个RecordSet对象,方便远程连接的操作。
建立一个Connection的方法很简单,下面例子主要介绍了Connection对象的创建、连接数据库以及关闭连接的方法:
Sub ConnectionExample()
Dim cnn as ADODB.connection
Set cnn=new ADODB.connection
’通过ODBC DSN打开数据库
cnn.open,pubs”,”sa”,””
’检查是否成功建立连接对象
if cnn.state=adStateOpen then
msgbox,Welcome to pubs!”
else
msgbox,Sorry,no pubs!”
end if
’关闭连接对象
cnn.close
End sub
其重要属性如表1—1所示。
表1-1 Connection对象属性列表
属性
功能
ConnectionString
打开Connection时的参数设置。主要有以下几项:Provider、File Name、Remote Provider、Remote Server、URL
DefaultDatabase
定义Connection对象的缺省数据库
Provider
定义Connection对象的数据库OLE DB的提供者,如SQL Server之类
State
当前状态,只读。主要返回值为adStateOpen或adStateExecuting
其重要方法如表1—2所示。
表1-2 Connection对象方法列表
方法
功能
BeginTrans
开始一个新的处理事务(Transaction)
RollbackTrans
放弃当前所有的处理事务并开启一个新的事务
Cancel
终止当前的数据库操作
Close
关闭释放Connection对象
Execute
执行SQL语言,或者查询
Open
打开Connection对象
在建立连接对象后,可以通过conn.Execute方法执行SQL,实现所需的一切功能。编写数据库程序时,在修改数据库内容方面,这种方法很方便而且功能强大。
2.记录集对象——Recordset
Recordset对象表示的是来自基本表或命令执行结果的记录全集,任何时候,Recordset对象所指的当前记录均为集合内的单个记录。
可使用Recordset对象操作来自提供者的数据,使用ADO时,通过Records对象可对几乎所有数据进行操作。所有Recordset对象均使用记录(行)和字段(列)进行构造。由于提供者所支持的功能不同,某些Recordset方法或属性有可能无效。
打开Recordset时,当前记录位于第一个记录(如果有),并且BOF和EOF属性被设置为False。如果没有记录,BOF和EOF属性设置是True。
假设提供者支持相关的功能,可以使用MoveFirst、MoveLast、MoveNext和MovePrevious方法以及Move方法,和AbsolutePosition、AbsolutePage和Filter属性来重新确定当前记录的位置。
Recordset对象可支持两类更新:立即更新和批更新。
使用立即更新,一旦调用Update方法,对数据的所有更改将被立即写入基本数据源。也可以使用AddNew和Update方法将值的数组作为参数传递,同时更新记录的若干字段。
如果提供者支持批更新,可以使提供者将多个记录的更改存入缓存,然后使用 UpdateBatch方法在单个调用中将它们传送给数据库。这种情况应用于使用AddNew、Update和Delete方法所做的更改。调用UpdateBatch方法后,可以使用Status属性检查任何数据冲突并加以解决。
3.命令对象——Command (了解)
Command 对象也是ADO的特色之一。一般用于大量数据的操作或者是对数据库表单结构的操作。Command的重要属性如表1-3所示,重要方法如表1-4所示。
表1-3 Command对象属性列表
属性
功能
ActiveConnection
指定当前命令对象属于哪个Connection
CommandStream
指定提供命令参数的流
CommandText
指定参数
Dialect
指定参数的语法规范
State
Command对象运行状态
表1-4 Command对象方法列表
方法
功能
Cancel
放弃操作
CreateParameter
创建参数
Excute
执行参数
4.字段对象——Field
Field 对象代表使用普通数据类型的数据的列。Recordset对象含有由Field对象组成的Fields集合。每个Field对象对应于Recordset中的一列,其重要属性如表1-5所示。
表1-5 Field对象属性列表
属性
功能
Name
返回字段名
DefineSize
返回己声明的字段大小
Value
查看或更改字段中的数据
ActualSize
返回给定字段中数据的实际大小
NativeError
指示给定Error对象的、特定提供者的错误代码
重要方法如表1-6所示。
表1-6 Field对象方法列表
属性
功能
AppendChunk
将数椐追加到大型文本、二进制数据中
GetChunk
返回大型文本或二进制数据Field对象的全部或部分内容
5.错误集合——Errors(了解)
Error对象包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。
任何涉及ADO对象的操作都会生成一个或多个提供者错误。每个错误出现时,一个或多个Error对象将被放到Connection对象的Errors集合中。当另一个ADO操作产生错误时,Errors集合将被清空,并在其中放入新的Error对象集。
每个Error对象都代表特定的提供者错误而不是ADO错误,ADO错误被记载到运行时例外处理机制中。例如,在Microsoft Visual Basic中,产生特定AD0的错误将触发On Error
事件并出现在Err对象中。Error的主要属性如表1-7所示。
表1-7 Error对象属性列表
属性
功能
Description
包含错误的文本
Number
包含错误常量的长整型数目
Source
标识产生错误的对象。在向数据源发出请求之后,如果Errors集合中有多个Error对象,则将会用到该属性
SQLState
指示给定Error对象的sQL状态
NativeError
指不给定Errorr对象的、特定提供者的错误代码
出现提供者错误时,Error对象将被放在Connection对象的Error集合中。ADO支持由单个ADO操作返回多个错误,以便显示特定提供者的错误信息。要在错误处理程序中获得丰富的错误信息,可使用相应的语言或所在工作环境下的错误捕获功能,然后使用嵌套循环枚举出Errors集合的每个Error对象的属性。
Errors集合的重要方法如表1-8所示。
表1-8 Error集合的方法列表
方法
功能
Clear
删除集合中的所有对象
Item
根据名称或序号返回集合的特定成员
1.2用ADO对象操纵数据库
在使用ADO对象操作数据库时,主要采取如下的步骤和方法:
·打开数据库。首先需要创建数据库连接对象(connection),然后调用该对象的Open方法即可打开数据库。
·操作数据库数据。在数据库打开之后,通过Connection、Command对象执行SQL命令,或者创建记录集(Recordset)对象,使用该对象的各种方法就可以进行数据库数据的查询、定位以及增加、删除和修改。
·关闭数据库。使用上面创建的数据库连接对象的close方法就可以进行数据库的关闭。
下面就分别详细介绍以上所说的各个步骤和方法。
1.2.1 AD0连接数据库
1.连接到ODBC数据源当前使用的所有DBMS(数据库管理系统)系统实际上都可以通过ODBC进行访问。
Microsoft ODBC Provider允许ADO连接到任何ODBC的数据源。ODBC驱动程序对于当今使用的各种主要DBMS都有效,包括Microsoft SQL Server、Microsoft Access(Microsoft Jet数据库引擎)和Microsoft FoxPro以及诸如Oracle等非Microsoft数据库产品。
要连接Microsoft ODBC Provider,就需要将连接字符串属性(ConnectionString)的参数,Provider=”设置为:MSDASQL,可以省略Provider参数。
可以使用或不使用预定义的数据源名(DSN)或FileDSN进行连接。
带有DSN或FileDSN的语法如下:
“[Provider=MSDASQL;]{DSN=name| FileDSN=filename};[DATABASE=database;] UID=user;PWD=password”
无DSN(非DSN连接)的语法如下:
“[Provider=MSDASQL;] DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password”
如果使用DSN或FileDSN,则必须通过“Windows控制面板”中的“ODBC管理器”进行定义。作为设置DSN的替换方法,可以指定ODBC的驱动程序(DRIVER=),诸如;“SQLServer”、服务器名(SERVER=)和数据库名(DATABASE=)。
也可以在特定ODBC的参数或标准ADO定义的UserID和Password参数中为用户帐号:指定用户账号名(UID=)和密码(PWD=)。
即使DSN定义已经指定了数据库,也可以在DSN之外指定DATABASE参数以便连接到不同的数据库。这同时更改了DSN定义以包括指定的数据库。使用DSN时始终包括 DATABASE参数是一种好办法。这样将保证能连接到正确的数据库,因为其他用户可能会在上一次检查DSN定义后更改默认的数据库参数。
2.连接到Access数据库可以使用指定OLE DB提供者和连接字符串来连接Access数据文件。例如:
set con=new ADODB.connection
con.Open "provider=Microsoft.Jet.OLEDB.4.0;
Data Source=c:\library.mdb;Persist Security Info=False"
其中c:\library.mdb为数据库的路径和名称。
如果数据库有密码,则:
Provider=Microsoft.Jet.OLEDB.4.0;Password=sa;User ID=rose;DataSource= c:\library.mdb;Persist Security Info=True
其中rose为用户名;sa为密码
如果数据库是局域网其他计算机上的,那么这个数据库所在的至少上一层目录为共享,采用下面办法:
Provider=Microsoft.Jet.OLEDB.4.0;UserID=rose;DataSource=
\\qyKong\data\library.mdb;Persist Security Info=False
这里“\\qyKong\data\library.mdb”为在网络邻居中名qyKong的机器上(IP也可以)上的data文件夹下的名为library的Access数据。
3.连接到SQL Server数据源
以下范例通过打开3个使用不同提供者的Connection对象演示Provider属性,还使用 DefaultDatabase属性设置Microsoft ODBC提供者的默认数据库。
Private Sub Providerx()
Dim cnn1 As ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
'使用Microsoft ODBC提供者打开数据库
Set cnn1 = New ADODB.Connection
cnn1.ConnectionString = "driver={SQL Server};" & _
"server=bigsmile;uid=sa;pwd=pwd"
cnn1.Open strcnn
cnn1.DefaultDatabase = "Pubs"
'显示提供者
MsgBox "cnn1 provider:" & cnn1.Provider
'使用Microsoft Jet提供者打开数据库
Set cnn2 = New ADODB.Connection
cnn2.Provider = "Microsoft.Jet.OLEDB.3.51"
cnn2.Open "c:\samples\northwind.mdb","admin"
'显示提供者
MsgBox "cnn2 provider:" & cnn2.Provider
'使用Microsoft SQL服务器提供者打开数据库
Set cnn3 = New ADODB.Connection
cnn3.Provider = "sqloledb"
cnn3.Open "Data source=srv;Initial Catalog=pubs;","sa"
'显示提供者
MsgBox "cnn3 provider:" & cnn3.Provider
cnn1.Close
cnn2.Close
cnn3.Close
End Sub
通过以上介绍,可以总结出ADO与不同数据库连接所使用的连接字符串如下:
ODBC连接
ODBC-DSN连接方法:
cnn.Open "dsn=advWorks;uid=admin;pwd=;"
advWorks为数据源名。
②ODBC-File DSN连接方法:
cnn.Open "filedsn=c:\somepath\mydb.dsn;uid=admin;pwd=;"
③ODBC Driver for Access
方法:
cnn.Open "driver={Microsoft Access Driver (*.mdb)};dbq= c:\somepath\mydb.mdb;uid=admin;pwd=;"
④ODBC Driver for SQL Server
方法:
cnn.Open "driver={SQL Server};server=myServerName;database= myDatabaseName;uid=admin;pwd=;"
OLE DB Provider连接
OLE DB Provider For Microsoft Jet
方法:
con.Open "provider=Microsoft.Jet.OLEDB.4.0; Data Source= c:\somepath\mydb.mdb;uid=admin;pwd=;"
OLE DB Provider For ODBC Database
Access(Jet)方法:
cnn.Open "Provider=MSDASQL;driver={Microsoft Access Driver (*.mdb)};dbq=c:\somepath\mydb.mdb;uid=myUserName;pwd=myPassWord;"
SQL Server,方法:
cnn.Open "Provider=MSDASQL;driver={SQL Server}; server=myServerName;database=myDatabaseName; uid=myUserName;pwd=myPassWord;"
MS remote 连接
MS remote for Access(Jet)
通过ODBC DSN方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider=MSDASQL; dsn=advWorks;uid=myUserName;pwd=myPassWord;"
通过OLE DB Provider方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider= Microsoft.Jet.OLEDB.4.0; database= myDatabaseName; uid=admin;pwd=;"
MS remote for SQL Server
通过ODBC DSN方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider=MSDASQL; dsn=myDataSourceName;
uid=myUserName;pwd=myPassWord;"
通过OLE DB Provider方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider=SQLOLEDB; dataSource= myServerName;
Initial Catalog=myDatabaseName; uid=myUserName;pwd=myPassWord;"
1.2.2用记录集(Recordset)对象操纵数据记录集(Recordset)对象是ADO操作数据最常用的对象,也是学习的关键所在。
1.创建、打开RecordSet对象以及浏览数据记录下面来学习一个例子(例6.0):
注意:要想在程序中使用ADO对象,必须先为当前工程引用ADO的对象库。引用方式是执行“工程”菜单的“引用”命令,启动引用对话框,在清单中选取“Microsoft ActiveX Data Objects 2.0 Library”选项。
Public Sub ADOOopenRecords()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
'打开连接
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\northwind.mdb;Persist Security Info=False"
'打开方式 forward_only,read_only
Set rst = New ADODB.Recordset
rst.Open "select * from 客户 where 地区='WA'",cnn,adOpenForwardOnly,adLockReadOnly
'输出第一个记录的所有字段值
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
Debug.Print
'关闭数据记录集对象
rst.Close
cnn.Close
End Sub
至于Move,MoveNext,MoveFirst之类的方法,和DAO用法相同。
2.查询数据记录
ADO的查询数据库记录只有Find方法,该方法允许使用一个查找字符串,它由单引号(’)或数码符号(#)加以封闭。双引号(”)不能使用,数码符号必须封闭数值。
如果使用Like操作符,就可以用星号(*)作为字符串值中的通配符。然而,星号必须是值中的最后一个字符或值中的唯一字符。否则会发生运行时错误。
除了搜寻条件外,Find方法还有几个参数。应指明开始搜索时要跳过的记录数;否则,搜索从当前记录开始。当要开始搜索下一个值时,应当指明一个起始值。
在记录集中也可以指明是否向回搜索(相开头)或者向前(向尾部),可以通过指明书签作为搜索的开始位置。
find方法的调用语法是:
RstName.Find strCriteria[,IngSkipRecords,IngSearchDirection[,varStart]]
其中strCriteria是查找条件,比较符仅限于“=”、“>”、“<”、“>=”、“<=”和“LIKE”,比较只是针对于表中的单个字段。
3.增、删、改数据记录
ADO可以用与DAO完全相同的方法进行添加、删除的操作。唯一不同的是要先建立一个connection对象。
ADO还提供了一种快捷的添加方式:
Rst.AddNew Array("CompanyName","Phone"),Array("ABCD CO"," (010)123-4567")
修改现有记录时,ADO不需要调用Edit方法,直接对当前记录某字段属性赋值之后调用update方法就可以实现。
4.构造无数据源的数据集所述的无“数据源”连接,意义不是不需要数据源,否则连接无从谈起,而是不需要配置注册数据源所进行的连接。ODBC是用不同数据源的标准编程语言接口。
根据前面的有关章节介绍,在实现ODBC时,必须首先配置ODBC环境,进行数据源的注册,然后才能在对数据库编程时,对数据源进行连接、访问和操作。
ADO是微软提供的数据库访问技术。它被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal Data Access)能力。OLE DB是一个底层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库、电子邮件系定义的商业对象等。
构造无数据源的数据集的方法主要是在代码中对Connection对象的ConnectionString属性进行设置。代码如下所示:
Dim cnn1 A1s ADODB.Connection
Set cnn1 = New ADODB.Connection
’不使用DSN打开数据库
cnn1.ConnectionString = "driver={SQL Server};" & _
"server=bigsmile;uid=sa;pwd=pwd;database=pubs"
cnn1.Connectiontimeout=30
cnn1.Open
以上代码完成了对bigsmile数据库服务器上的SQL Server数据库pubs的连接,其中连接的用户名为sa,密码为pwd。完成了连接后,按照前面介绍的方法,就可以进行记录集的创建以及对数据的增、删、改和查询了。,
1.2.3 ADO运行无返回值的查询语句
使用Connection对象的Execute方法,可执行任何在指定连接的参数中传送给方法的查询。如果参数指定按行返回的查询,执行产生的任何结果将存储在新的Recordset对象中。如果命令不是按行返回的查询,则提供者返回关闭的Recordset对象,此时返回的Recordset对象始终为只读、仅向前的游标。如需要具有更多功能的Recordset对象,应首先创建具有所需属性设置的Recordset对象,然后使用Recordset对象的Open方法执行查询并返回所需游标类型。具体的语法如下:
对于非按行返回的命令字符串:
connection.Execute CommandText,RecordsAffected,Options
对于按行返回的命令字符串:
Set recordset=connection.Execute(CommandText,RecordsAffected,Options)
代码如下所示:
Sub ExcuteX()
Dim cnn As ADODB.Connection
Dim strSQLChange As String
'定义SQL语句作为命令文本执行
strSQLChange = "update employees set first name='steven' where employee ID='1'"
'打开连接
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\northwind.mdb;"
'执行查询命令
cnn.Execute strSQLChange,,adExcuteNoRecords
cnn.Close
End Sub
1.2.4 ADO控件及对象编程举例
ADO控件编程例6-1,使用ADO控件的属性和方法进行编程。使用绑定控件增加、删除、修改书籍(Titles)信息。运行效果如图1-1。
图1-1 ADO控件编程表1.9 主要控件对象的属性控件
属性
值
Adodc1
caption
数据浏览
Text1(0)
控件数组名Text1
Index
Datasource
DataField
0
Adodc1
TitleId
Text1(1)
Index
Datasource
DataField
1
Adodc1
Subject
Text1(2)
Index
Datasource
DataField
2
Adodc1
Author
Text1(3)
Index
Datasource
DataField
3
Adodc1
Title
Text1(4)
Index
Datasource
DataField
4
Adodc1
Price
Text1(5)
Index
Datasource
DataField
5
Adodc1
Quantity
代码如下:
Private Sub Form_Load() ’窗体加载
Adodc1.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False"
Adodc1.RecordSource = "select * from Titles"
Adodc1.Refresh
For i = 0 To 5
Text1(i).Enabled = False ’不允许修改
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
End Sub
Private Sub cmdadd_Click() ’添加记录
Adodc1.Recordset.AddNew
For i = 0 To 5
Text1(i).Enabled = True
Text1(i).Text = ""
Next i
Text1(0).SetFocus
cmdadd.Enabled = False
cmddelete.Enabled = False
cmdedit.Enabled = False
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
End Sub
Private Sub cmddelete_Click() ’删除记录
Dim myval As String
myval = MsgBox("是否要删除该记录?",vbYesNo)
If myval = vbYes Then
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast
For i = 0 To 5
Text1(i).Enabled = False
Next i
End If
End Sub
Private Sub cmdedit_Click() ’修改记录
If Adodc1.Recordset.RecordCount <> 0 Then
For i = 0 To 5
Text1(i).Enabled = True
Next i
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdadd.Enabled = False
cmdedit.Enabled = False
cmddelete.Enabled = False
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
Else
MsgBox ("没有要修改的记录!")
End If
End Sub
Private Sub cmdsave_Click() ’保存记录
If Text1(0).Text = "" Then
MsgBox "书籍编号不能为空!"
Text1(0).SetFocus
Exit Sub
End If
Adodc1.Recordset.Update
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdcancel_Click() ’放弃修改
Adodc1.Recordset.CancelUpdate
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdmove_Click(Index As Integer) ’移动记录指针
Select Case Index
Case 0
Adodc1.Recordset.MoveFirst
Case 1
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst
Case 2
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast
Case 3
Adodc1.Recordset.MoveLast
End Select
End Sub
Private Sub cmdExit_Click() ’退出
Unload Me
End Sub
ADO对象编程
注意:为了使用ADO对象编程,必须在程序中引入ADO对象。引入ADO对象的方法是选择菜单“工程”→“引用”,在清单中选择“Microsoft ActiveX Data Objects 2.0 Library”。
例6-2,使用ADO对象进行编程,增加、删除、修改书籍(Titles)信息。控件不需要绑定,即text控件不需设置 Datasource和DataField属性。运行效果如图1-2。
图1-2 ADO对象编程
代码如下:
Dim rs As New ADODB.Recordset '声明数据库连接对象
Dim cnn As ADODB.Connection '声明记录集对象
Private Sub Form_Load() '窗体加载
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False"
Set rs = New ADODB.Recordset
rs.Open "select * from titles",cnn,adOpenDynamic,adLockOptimistic
If rs.BOF And rs.EOF Then
MsgBox "表中无记录!"
Else
rs.MoveFirst
Call viewdata
End If
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
End Sub
Private Sub viewdata() '浏览数据
On Error Resume Next
Text1(0).Text = rs.Fields("TitleId")
Text1(1).Text = rs.Fields("Subject")
Text1(2).Text = rs.Fields("Author")
Text1(3).Text = rs.Fields("Title")
Text1(4).Text = rs.Fields("Price")
Text1(5).Text = rs.Fields("quantity")
End Sub
Private Sub cmdadd_Click() '增加记录
rs.AddNew
For i = 0 To 5
Text1(i).Enabled = True
Text1(i).Text = ""
Next i
Text1(0).SetFocus
cmdadd.Enabled = False
cmddelete.Enabled = False
cmdedit.Enabled = False
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
End Sub
Private Sub cmddelete_Click() '删除记录
Dim myval As String
myval = MsgBox("是否要删除该记录?",vbYesNo)
If myval = vbYes Then
rs.Delete
rs.MoveNext
If rs.EOF Then rs.MoveLast
Call viewdata
For i = 0 To 5
Text1(i).Enabled = False
Next i
End If
End Sub
Private Sub cmdedit_Click() '编辑记录
If rs.RecordCount <> 0 Then
For i = 0 To 5
Text1(i).Enabled = True
Next i
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdadd.Enabled = False
cmdedit.Enabled = False
cmddelete.Enabled = False
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
Else
MsgBox ("没有要修改的记录!")
End If
End Sub
Private Sub cmdsave_Click() '保存记录
If Text1(0).Text = "" Then
MsgBox "书籍编号不能为空!"
Text1(0).SetFocus
Exit Sub
End If
rs.Fields("TitleId") = Text1(0).Text
rs.Fields("Subject") = Text1(1).Text
rs.Fields("Author") = Text1(2).Text
rs.Fields("Title") = Text1(3).Text
rs.Fields("Price") = Text1(4).Text
rs.Fields("quantity") = Text1(5).Text
rs.Update
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdcancel_Click() '放弃修改
rs.CancelUpdate
rs.MoveFirst
Call viewdata
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdmove_Click(Index As Integer) '移动记录指针
Select Case Index
Case 0
rs.MoveFirst
Case 1
rs.MovePrevious
If rs.BOF Then rs.MoveFirst
Case 2
rs.MoveNext
If rs.EOF Then rs.MoveLast
Case 3
rs.MoveLast
End Select
Call viewdata
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
3.SQL与ADO对象联合编程
例1-3,SQL与ADO对象联合编程,增加、删除、修改书籍(Titles)信息。运行效果如图1-3。
图1-3 SQL与ADO对象联合编程
代码如下:
Dim sql As String
Dim rs As New ADODB.Recordset '声明数据库连接对象
Dim cnn As ADODB.Connection '声明记录集对象
Private Sub Form_Load() '窗体加载
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False"
Set rs = New ADODB.Recordset
rs.Open "select * from titles",cnn,adOpenDynamic,adLockOptimistic
If rs.BOF And rs.EOF Then
MsgBox "表中无记录!"
Else
rs.MoveFirst
Call viewdata
End If
cmdsave.Enabled = False
End Sub
Private Sub viewdata() '浏览数据
On Error Resume Next
Text1(0).Text = rs.Fields("TitleId")
Text1(1).Text = rs.Fields("Subject")
Text1(2).Text = rs.Fields("Author")
Text1(3).Text = rs.Fields("Title")
Text1(4).Text = rs.Fields("Price")
Text1(5).Text = rs.Fields("quantity")
End Sub
Private Sub cmdadd_Click() '增加记录
For i = 0 To 5
Text1(i).Text = ""
Next i
Text1(0).SetFocus
cmdadd.Enabled = False
cmddelete.Enabled = False
cmdedit.Enabled = False
cmdsave.Enabled = True
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
End Sub
Private Sub cmddelete_Click() '删除记录
Dim myval As String
myval = MsgBox("是否要删除该记录?",vbYesNo)
If myval = vbYes Then
mysql = "delete from Titles where TitleId='"
mysql = mysql + Text1(0).Text + "'"
cnn.Execute mysql
rs.Close
sql = "select * from Titles"
rs.Open sql,cnn,adOpenDynamic,adLockOptimistic
If rs.BOF And rs.EOF Then
MsgBox "表中无记录!"
Else
rs.MoveFirst
Call viewdata
End If
End If
End Sub
Private Sub cmdedit_Click() '修改记录
Dim myval As String
Text1(0).Locked = True 'TitleId是主键,不能修改
mysql = "update Titles set Subject='" + Text1(1).Text + "',Author='"
mysql = mysql + Text1(2).Text + "',Title='"
mysql = mysql + Text1(3).Text + "',price="
mysql = mysql + Text1(4).Text + ",quantity="
mysql = mysql + Text1(5).Text + " where TitleId='" + Text1(0).Text + "'"
cnn.Execute mysql
MsgBox "修改完毕!"
Text1(0).Locked = False
End Sub
Private Sub cmdsave_Click() '保存记录
Dim mysql As String
If Text1(0).Text = "" Then
MsgBox "编号不能为空!"
Text1(0).SetFocus
Exit Sub
End If
Dim rstemp As New ADODB.Recordset
Dim strtemp As String
strtemp = "select * from Titles where TitleId='" & Trim(Text1(0).Text) & "';"
rstemp.Open strtemp,cnn,adOpenDynamic,adLockPessimistic
If Not rstemp.EOF Then
MsgBox "编号不唯一,重新输入!"
Text1(0).Text = ""
Text1(0).SetFocus
rstemp.Close
Exit Sub
End If
rstemp.Close
mysql = "insert into titles (titleId,Subject,Author,title,price,quantity) values ('"
mysql = mysql + Text1(0).Text + "','"
mysql = mysql + Text1(1).Text + "','"
mysql = mysql + Text1(2).Text + "','"
mysql = mysql + Text1(3).Text + "',"
mysql = mysql + Text1(4).Text + ","
mysql = mysql + Text1(5).Text + ")"
cnn.Execute mysql
MsgBox "保存成功!"
'刷新新增加的记录
rs.Close
sql = "select * from titles"
rs.Open sql,cnn,adOpenDynamic,adLockOptimistic
rs.MoveLast
Call viewdata
cmdsave.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdmove_Click(Index As Integer) '记录指针移动
On Error Resume Next
Select Case Index
Case 0
rs.MoveFirst
Case 1
rs.MovePrevious
If rs.BOF Then rs.MoveFirst
Case 2
rs.MoveNext
If rs.EOF Then rs.MoveLast
Case 3
rs.MoveLast
End Select
Call viewdata
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
1.1ADO基础
1.1.1 ADO的介绍
ADO是ActiveX Data Object的缩写,它是Microsoft数据库应用程序开发的新接口,是Microsoft新的数据访问技术,是建立在OLE DB之上的高层数据库访问技术。
ADO被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal Data Access)。OLE DB是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象即使对OLE DB不了解也能轻松使用ADO,因为它非常简单易用,并不失灵活性。
ADO向VB程序员提供了很多好处,包括易于使用、熟悉的界面,高速度以及较低的内存占用。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立建立。因此可以只创建一个“Connection”对象,但是可以有多个,独立的“Recordset”对象来使用它,另外ADO针对客户/服务器以及Web应用程序作了优化。
ADO最基本的操作流程:初始化COM库,引入ADO库定义文件;用Connection对象连接数据库;利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理;使用完毕后关闭连接释放对象。
1.1.2 AD0的对象数据库连接对象——Connection
这是ADO的最大特点。每一次引用数据库可以建立一个连接对象,然后在其之上建立多个RecordSet对象,方便远程连接的操作。
建立一个Connection的方法很简单,下面例子主要介绍了Connection对象的创建、连接数据库以及关闭连接的方法:
Sub ConnectionExample()
Dim cnn as ADODB.connection
Set cnn=new ADODB.connection
’通过ODBC DSN打开数据库
cnn.open,pubs”,”sa”,””
’检查是否成功建立连接对象
if cnn.state=adStateOpen then
msgbox,Welcome to pubs!”
else
msgbox,Sorry,no pubs!”
end if
’关闭连接对象
cnn.close
End sub
其重要属性如表1—1所示。
表1-1 Connection对象属性列表
属性
功能
ConnectionString
打开Connection时的参数设置。主要有以下几项:Provider、File Name、Remote Provider、Remote Server、URL
DefaultDatabase
定义Connection对象的缺省数据库
Provider
定义Connection对象的数据库OLE DB的提供者,如SQL Server之类
State
当前状态,只读。主要返回值为adStateOpen或adStateExecuting
其重要方法如表1—2所示。
表1-2 Connection对象方法列表
方法
功能
BeginTrans
开始一个新的处理事务(Transaction)
RollbackTrans
放弃当前所有的处理事务并开启一个新的事务
Cancel
终止当前的数据库操作
Close
关闭释放Connection对象
Execute
执行SQL语言,或者查询
Open
打开Connection对象
在建立连接对象后,可以通过conn.Execute方法执行SQL,实现所需的一切功能。编写数据库程序时,在修改数据库内容方面,这种方法很方便而且功能强大。
2.记录集对象——Recordset
Recordset对象表示的是来自基本表或命令执行结果的记录全集,任何时候,Recordset对象所指的当前记录均为集合内的单个记录。
可使用Recordset对象操作来自提供者的数据,使用ADO时,通过Records对象可对几乎所有数据进行操作。所有Recordset对象均使用记录(行)和字段(列)进行构造。由于提供者所支持的功能不同,某些Recordset方法或属性有可能无效。
打开Recordset时,当前记录位于第一个记录(如果有),并且BOF和EOF属性被设置为False。如果没有记录,BOF和EOF属性设置是True。
假设提供者支持相关的功能,可以使用MoveFirst、MoveLast、MoveNext和MovePrevious方法以及Move方法,和AbsolutePosition、AbsolutePage和Filter属性来重新确定当前记录的位置。
Recordset对象可支持两类更新:立即更新和批更新。
使用立即更新,一旦调用Update方法,对数据的所有更改将被立即写入基本数据源。也可以使用AddNew和Update方法将值的数组作为参数传递,同时更新记录的若干字段。
如果提供者支持批更新,可以使提供者将多个记录的更改存入缓存,然后使用 UpdateBatch方法在单个调用中将它们传送给数据库。这种情况应用于使用AddNew、Update和Delete方法所做的更改。调用UpdateBatch方法后,可以使用Status属性检查任何数据冲突并加以解决。
3.命令对象——Command (了解)
Command 对象也是ADO的特色之一。一般用于大量数据的操作或者是对数据库表单结构的操作。Command的重要属性如表1-3所示,重要方法如表1-4所示。
表1-3 Command对象属性列表
属性
功能
ActiveConnection
指定当前命令对象属于哪个Connection
CommandStream
指定提供命令参数的流
CommandText
指定参数
Dialect
指定参数的语法规范
State
Command对象运行状态
表1-4 Command对象方法列表
方法
功能
Cancel
放弃操作
CreateParameter
创建参数
Excute
执行参数
4.字段对象——Field
Field 对象代表使用普通数据类型的数据的列。Recordset对象含有由Field对象组成的Fields集合。每个Field对象对应于Recordset中的一列,其重要属性如表1-5所示。
表1-5 Field对象属性列表
属性
功能
Name
返回字段名
DefineSize
返回己声明的字段大小
Value
查看或更改字段中的数据
ActualSize
返回给定字段中数据的实际大小
NativeError
指示给定Error对象的、特定提供者的错误代码
重要方法如表1-6所示。
表1-6 Field对象方法列表
属性
功能
AppendChunk
将数椐追加到大型文本、二进制数据中
GetChunk
返回大型文本或二进制数据Field对象的全部或部分内容
5.错误集合——Errors(了解)
Error对象包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。
任何涉及ADO对象的操作都会生成一个或多个提供者错误。每个错误出现时,一个或多个Error对象将被放到Connection对象的Errors集合中。当另一个ADO操作产生错误时,Errors集合将被清空,并在其中放入新的Error对象集。
每个Error对象都代表特定的提供者错误而不是ADO错误,ADO错误被记载到运行时例外处理机制中。例如,在Microsoft Visual Basic中,产生特定AD0的错误将触发On Error
事件并出现在Err对象中。Error的主要属性如表1-7所示。
表1-7 Error对象属性列表
属性
功能
Description
包含错误的文本
Number
包含错误常量的长整型数目
Source
标识产生错误的对象。在向数据源发出请求之后,如果Errors集合中有多个Error对象,则将会用到该属性
SQLState
指示给定Error对象的sQL状态
NativeError
指不给定Errorr对象的、特定提供者的错误代码
出现提供者错误时,Error对象将被放在Connection对象的Error集合中。ADO支持由单个ADO操作返回多个错误,以便显示特定提供者的错误信息。要在错误处理程序中获得丰富的错误信息,可使用相应的语言或所在工作环境下的错误捕获功能,然后使用嵌套循环枚举出Errors集合的每个Error对象的属性。
Errors集合的重要方法如表1-8所示。
表1-8 Error集合的方法列表
方法
功能
Clear
删除集合中的所有对象
Item
根据名称或序号返回集合的特定成员
1.2用ADO对象操纵数据库
在使用ADO对象操作数据库时,主要采取如下的步骤和方法:
·打开数据库。首先需要创建数据库连接对象(connection),然后调用该对象的Open方法即可打开数据库。
·操作数据库数据。在数据库打开之后,通过Connection、Command对象执行SQL命令,或者创建记录集(Recordset)对象,使用该对象的各种方法就可以进行数据库数据的查询、定位以及增加、删除和修改。
·关闭数据库。使用上面创建的数据库连接对象的close方法就可以进行数据库的关闭。
下面就分别详细介绍以上所说的各个步骤和方法。
1.2.1 AD0连接数据库
1.连接到ODBC数据源当前使用的所有DBMS(数据库管理系统)系统实际上都可以通过ODBC进行访问。
Microsoft ODBC Provider允许ADO连接到任何ODBC的数据源。ODBC驱动程序对于当今使用的各种主要DBMS都有效,包括Microsoft SQL Server、Microsoft Access(Microsoft Jet数据库引擎)和Microsoft FoxPro以及诸如Oracle等非Microsoft数据库产品。
要连接Microsoft ODBC Provider,就需要将连接字符串属性(ConnectionString)的参数,Provider=”设置为:MSDASQL,可以省略Provider参数。
可以使用或不使用预定义的数据源名(DSN)或FileDSN进行连接。
带有DSN或FileDSN的语法如下:
“[Provider=MSDASQL;]{DSN=name| FileDSN=filename};[DATABASE=database;] UID=user;PWD=password”
无DSN(非DSN连接)的语法如下:
“[Provider=MSDASQL;] DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password”
如果使用DSN或FileDSN,则必须通过“Windows控制面板”中的“ODBC管理器”进行定义。作为设置DSN的替换方法,可以指定ODBC的驱动程序(DRIVER=),诸如;“SQLServer”、服务器名(SERVER=)和数据库名(DATABASE=)。
也可以在特定ODBC的参数或标准ADO定义的UserID和Password参数中为用户帐号:指定用户账号名(UID=)和密码(PWD=)。
即使DSN定义已经指定了数据库,也可以在DSN之外指定DATABASE参数以便连接到不同的数据库。这同时更改了DSN定义以包括指定的数据库。使用DSN时始终包括 DATABASE参数是一种好办法。这样将保证能连接到正确的数据库,因为其他用户可能会在上一次检查DSN定义后更改默认的数据库参数。
2.连接到Access数据库可以使用指定OLE DB提供者和连接字符串来连接Access数据文件。例如:
set con=new ADODB.connection
con.Open "provider=Microsoft.Jet.OLEDB.4.0;
Data Source=c:\library.mdb;Persist Security Info=False"
其中c:\library.mdb为数据库的路径和名称。
如果数据库有密码,则:
Provider=Microsoft.Jet.OLEDB.4.0;Password=sa;User ID=rose;DataSource= c:\library.mdb;Persist Security Info=True
其中rose为用户名;sa为密码
如果数据库是局域网其他计算机上的,那么这个数据库所在的至少上一层目录为共享,采用下面办法:
Provider=Microsoft.Jet.OLEDB.4.0;UserID=rose;DataSource=
\\qyKong\data\library.mdb;Persist Security Info=False
这里“\\qyKong\data\library.mdb”为在网络邻居中名qyKong的机器上(IP也可以)上的data文件夹下的名为library的Access数据。
3.连接到SQL Server数据源
以下范例通过打开3个使用不同提供者的Connection对象演示Provider属性,还使用 DefaultDatabase属性设置Microsoft ODBC提供者的默认数据库。
Private Sub Providerx()
Dim cnn1 As ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
'使用Microsoft ODBC提供者打开数据库
Set cnn1 = New ADODB.Connection
cnn1.ConnectionString = "driver={SQL Server};" & _
"server=bigsmile;uid=sa;pwd=pwd"
cnn1.Open strcnn
cnn1.DefaultDatabase = "Pubs"
'显示提供者
MsgBox "cnn1 provider:" & cnn1.Provider
'使用Microsoft Jet提供者打开数据库
Set cnn2 = New ADODB.Connection
cnn2.Provider = "Microsoft.Jet.OLEDB.3.51"
cnn2.Open "c:\samples\northwind.mdb","admin"
'显示提供者
MsgBox "cnn2 provider:" & cnn2.Provider
'使用Microsoft SQL服务器提供者打开数据库
Set cnn3 = New ADODB.Connection
cnn3.Provider = "sqloledb"
cnn3.Open "Data source=srv;Initial Catalog=pubs;","sa"
'显示提供者
MsgBox "cnn3 provider:" & cnn3.Provider
cnn1.Close
cnn2.Close
cnn3.Close
End Sub
通过以上介绍,可以总结出ADO与不同数据库连接所使用的连接字符串如下:
ODBC连接
ODBC-DSN连接方法:
cnn.Open "dsn=advWorks;uid=admin;pwd=;"
advWorks为数据源名。
②ODBC-File DSN连接方法:
cnn.Open "filedsn=c:\somepath\mydb.dsn;uid=admin;pwd=;"
③ODBC Driver for Access
方法:
cnn.Open "driver={Microsoft Access Driver (*.mdb)};dbq= c:\somepath\mydb.mdb;uid=admin;pwd=;"
④ODBC Driver for SQL Server
方法:
cnn.Open "driver={SQL Server};server=myServerName;database= myDatabaseName;uid=admin;pwd=;"
OLE DB Provider连接
OLE DB Provider For Microsoft Jet
方法:
con.Open "provider=Microsoft.Jet.OLEDB.4.0; Data Source= c:\somepath\mydb.mdb;uid=admin;pwd=;"
OLE DB Provider For ODBC Database
Access(Jet)方法:
cnn.Open "Provider=MSDASQL;driver={Microsoft Access Driver (*.mdb)};dbq=c:\somepath\mydb.mdb;uid=myUserName;pwd=myPassWord;"
SQL Server,方法:
cnn.Open "Provider=MSDASQL;driver={SQL Server}; server=myServerName;database=myDatabaseName; uid=myUserName;pwd=myPassWord;"
MS remote 连接
MS remote for Access(Jet)
通过ODBC DSN方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider=MSDASQL; dsn=advWorks;uid=myUserName;pwd=myPassWord;"
通过OLE DB Provider方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider= Microsoft.Jet.OLEDB.4.0; database= myDatabaseName; uid=admin;pwd=;"
MS remote for SQL Server
通过ODBC DSN方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider=MSDASQL; dsn=myDataSourceName;
uid=myUserName;pwd=myPassWord;"
通过OLE DB Provider方法:
cnn.Open "Provider=MS remote;Remote Server=http://myServerName;Remote Provider=SQLOLEDB; dataSource= myServerName;
Initial Catalog=myDatabaseName; uid=myUserName;pwd=myPassWord;"
1.2.2用记录集(Recordset)对象操纵数据记录集(Recordset)对象是ADO操作数据最常用的对象,也是学习的关键所在。
1.创建、打开RecordSet对象以及浏览数据记录下面来学习一个例子(例6.0):
注意:要想在程序中使用ADO对象,必须先为当前工程引用ADO的对象库。引用方式是执行“工程”菜单的“引用”命令,启动引用对话框,在清单中选取“Microsoft ActiveX Data Objects 2.0 Library”选项。
Public Sub ADOOopenRecords()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
'打开连接
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\northwind.mdb;Persist Security Info=False"
'打开方式 forward_only,read_only
Set rst = New ADODB.Recordset
rst.Open "select * from 客户 where 地区='WA'",cnn,adOpenForwardOnly,adLockReadOnly
'输出第一个记录的所有字段值
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
Debug.Print
'关闭数据记录集对象
rst.Close
cnn.Close
End Sub
至于Move,MoveNext,MoveFirst之类的方法,和DAO用法相同。
2.查询数据记录
ADO的查询数据库记录只有Find方法,该方法允许使用一个查找字符串,它由单引号(’)或数码符号(#)加以封闭。双引号(”)不能使用,数码符号必须封闭数值。
如果使用Like操作符,就可以用星号(*)作为字符串值中的通配符。然而,星号必须是值中的最后一个字符或值中的唯一字符。否则会发生运行时错误。
除了搜寻条件外,Find方法还有几个参数。应指明开始搜索时要跳过的记录数;否则,搜索从当前记录开始。当要开始搜索下一个值时,应当指明一个起始值。
在记录集中也可以指明是否向回搜索(相开头)或者向前(向尾部),可以通过指明书签作为搜索的开始位置。
find方法的调用语法是:
RstName.Find strCriteria[,IngSkipRecords,IngSearchDirection[,varStart]]
其中strCriteria是查找条件,比较符仅限于“=”、“>”、“<”、“>=”、“<=”和“LIKE”,比较只是针对于表中的单个字段。
3.增、删、改数据记录
ADO可以用与DAO完全相同的方法进行添加、删除的操作。唯一不同的是要先建立一个connection对象。
ADO还提供了一种快捷的添加方式:
Rst.AddNew Array("CompanyName","Phone"),Array("ABCD CO"," (010)123-4567")
修改现有记录时,ADO不需要调用Edit方法,直接对当前记录某字段属性赋值之后调用update方法就可以实现。
4.构造无数据源的数据集所述的无“数据源”连接,意义不是不需要数据源,否则连接无从谈起,而是不需要配置注册数据源所进行的连接。ODBC是用不同数据源的标准编程语言接口。
根据前面的有关章节介绍,在实现ODBC时,必须首先配置ODBC环境,进行数据源的注册,然后才能在对数据库编程时,对数据源进行连接、访问和操作。
ADO是微软提供的数据库访问技术。它被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal Data Access)能力。OLE DB是一个底层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库、电子邮件系定义的商业对象等。
构造无数据源的数据集的方法主要是在代码中对Connection对象的ConnectionString属性进行设置。代码如下所示:
Dim cnn1 A1s ADODB.Connection
Set cnn1 = New ADODB.Connection
’不使用DSN打开数据库
cnn1.ConnectionString = "driver={SQL Server};" & _
"server=bigsmile;uid=sa;pwd=pwd;database=pubs"
cnn1.Connectiontimeout=30
cnn1.Open
以上代码完成了对bigsmile数据库服务器上的SQL Server数据库pubs的连接,其中连接的用户名为sa,密码为pwd。完成了连接后,按照前面介绍的方法,就可以进行记录集的创建以及对数据的增、删、改和查询了。,
1.2.3 ADO运行无返回值的查询语句
使用Connection对象的Execute方法,可执行任何在指定连接的参数中传送给方法的查询。如果参数指定按行返回的查询,执行产生的任何结果将存储在新的Recordset对象中。如果命令不是按行返回的查询,则提供者返回关闭的Recordset对象,此时返回的Recordset对象始终为只读、仅向前的游标。如需要具有更多功能的Recordset对象,应首先创建具有所需属性设置的Recordset对象,然后使用Recordset对象的Open方法执行查询并返回所需游标类型。具体的语法如下:
对于非按行返回的命令字符串:
connection.Execute CommandText,RecordsAffected,Options
对于按行返回的命令字符串:
Set recordset=connection.Execute(CommandText,RecordsAffected,Options)
代码如下所示:
Sub ExcuteX()
Dim cnn As ADODB.Connection
Dim strSQLChange As String
'定义SQL语句作为命令文本执行
strSQLChange = "update employees set first name='steven' where employee ID='1'"
'打开连接
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\northwind.mdb;"
'执行查询命令
cnn.Execute strSQLChange,,adExcuteNoRecords
cnn.Close
End Sub
1.2.4 ADO控件及对象编程举例
ADO控件编程例6-1,使用ADO控件的属性和方法进行编程。使用绑定控件增加、删除、修改书籍(Titles)信息。运行效果如图1-1。
图1-1 ADO控件编程表1.9 主要控件对象的属性控件
属性
值
Adodc1
caption
数据浏览
Text1(0)
控件数组名Text1
Index
Datasource
DataField
0
Adodc1
TitleId
Text1(1)
Index
Datasource
DataField
1
Adodc1
Subject
Text1(2)
Index
Datasource
DataField
2
Adodc1
Author
Text1(3)
Index
Datasource
DataField
3
Adodc1
Title
Text1(4)
Index
Datasource
DataField
4
Adodc1
Price
Text1(5)
Index
Datasource
DataField
5
Adodc1
Quantity
代码如下:
Private Sub Form_Load() ’窗体加载
Adodc1.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False"
Adodc1.RecordSource = "select * from Titles"
Adodc1.Refresh
For i = 0 To 5
Text1(i).Enabled = False ’不允许修改
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
End Sub
Private Sub cmdadd_Click() ’添加记录
Adodc1.Recordset.AddNew
For i = 0 To 5
Text1(i).Enabled = True
Text1(i).Text = ""
Next i
Text1(0).SetFocus
cmdadd.Enabled = False
cmddelete.Enabled = False
cmdedit.Enabled = False
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
End Sub
Private Sub cmddelete_Click() ’删除记录
Dim myval As String
myval = MsgBox("是否要删除该记录?",vbYesNo)
If myval = vbYes Then
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast
For i = 0 To 5
Text1(i).Enabled = False
Next i
End If
End Sub
Private Sub cmdedit_Click() ’修改记录
If Adodc1.Recordset.RecordCount <> 0 Then
For i = 0 To 5
Text1(i).Enabled = True
Next i
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdadd.Enabled = False
cmdedit.Enabled = False
cmddelete.Enabled = False
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
Else
MsgBox ("没有要修改的记录!")
End If
End Sub
Private Sub cmdsave_Click() ’保存记录
If Text1(0).Text = "" Then
MsgBox "书籍编号不能为空!"
Text1(0).SetFocus
Exit Sub
End If
Adodc1.Recordset.Update
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdcancel_Click() ’放弃修改
Adodc1.Recordset.CancelUpdate
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdmove_Click(Index As Integer) ’移动记录指针
Select Case Index
Case 0
Adodc1.Recordset.MoveFirst
Case 1
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst
Case 2
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast
Case 3
Adodc1.Recordset.MoveLast
End Select
End Sub
Private Sub cmdExit_Click() ’退出
Unload Me
End Sub
ADO对象编程
注意:为了使用ADO对象编程,必须在程序中引入ADO对象。引入ADO对象的方法是选择菜单“工程”→“引用”,在清单中选择“Microsoft ActiveX Data Objects 2.0 Library”。
例6-2,使用ADO对象进行编程,增加、删除、修改书籍(Titles)信息。控件不需要绑定,即text控件不需设置 Datasource和DataField属性。运行效果如图1-2。
图1-2 ADO对象编程
代码如下:
Dim rs As New ADODB.Recordset '声明数据库连接对象
Dim cnn As ADODB.Connection '声明记录集对象
Private Sub Form_Load() '窗体加载
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False"
Set rs = New ADODB.Recordset
rs.Open "select * from titles",cnn,adOpenDynamic,adLockOptimistic
If rs.BOF And rs.EOF Then
MsgBox "表中无记录!"
Else
rs.MoveFirst
Call viewdata
End If
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
End Sub
Private Sub viewdata() '浏览数据
On Error Resume Next
Text1(0).Text = rs.Fields("TitleId")
Text1(1).Text = rs.Fields("Subject")
Text1(2).Text = rs.Fields("Author")
Text1(3).Text = rs.Fields("Title")
Text1(4).Text = rs.Fields("Price")
Text1(5).Text = rs.Fields("quantity")
End Sub
Private Sub cmdadd_Click() '增加记录
rs.AddNew
For i = 0 To 5
Text1(i).Enabled = True
Text1(i).Text = ""
Next i
Text1(0).SetFocus
cmdadd.Enabled = False
cmddelete.Enabled = False
cmdedit.Enabled = False
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
End Sub
Private Sub cmddelete_Click() '删除记录
Dim myval As String
myval = MsgBox("是否要删除该记录?",vbYesNo)
If myval = vbYes Then
rs.Delete
rs.MoveNext
If rs.EOF Then rs.MoveLast
Call viewdata
For i = 0 To 5
Text1(i).Enabled = False
Next i
End If
End Sub
Private Sub cmdedit_Click() '编辑记录
If rs.RecordCount <> 0 Then
For i = 0 To 5
Text1(i).Enabled = True
Next i
cmdsave.Enabled = True
cmdcancel.Enabled = True
cmdadd.Enabled = False
cmdedit.Enabled = False
cmddelete.Enabled = False
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
Else
MsgBox ("没有要修改的记录!")
End If
End Sub
Private Sub cmdsave_Click() '保存记录
If Text1(0).Text = "" Then
MsgBox "书籍编号不能为空!"
Text1(0).SetFocus
Exit Sub
End If
rs.Fields("TitleId") = Text1(0).Text
rs.Fields("Subject") = Text1(1).Text
rs.Fields("Author") = Text1(2).Text
rs.Fields("Title") = Text1(3).Text
rs.Fields("Price") = Text1(4).Text
rs.Fields("quantity") = Text1(5).Text
rs.Update
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdcancel_Click() '放弃修改
rs.CancelUpdate
rs.MoveFirst
Call viewdata
For i = 0 To 5
Text1(i).Enabled = False
Next i
cmdsave.Enabled = False
cmdcancel.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdmove_Click(Index As Integer) '移动记录指针
Select Case Index
Case 0
rs.MoveFirst
Case 1
rs.MovePrevious
If rs.BOF Then rs.MoveFirst
Case 2
rs.MoveNext
If rs.EOF Then rs.MoveLast
Case 3
rs.MoveLast
End Select
Call viewdata
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
3.SQL与ADO对象联合编程
例1-3,SQL与ADO对象联合编程,增加、删除、修改书籍(Titles)信息。运行效果如图1-3。
图1-3 SQL与ADO对象联合编程
代码如下:
Dim sql As String
Dim rs As New ADODB.Recordset '声明数据库连接对象
Dim cnn As ADODB.Connection '声明记录集对象
Private Sub Form_Load() '窗体加载
Set cnn = New ADODB.Connection
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb;Persist Security Info=False"
Set rs = New ADODB.Recordset
rs.Open "select * from titles",cnn,adOpenDynamic,adLockOptimistic
If rs.BOF And rs.EOF Then
MsgBox "表中无记录!"
Else
rs.MoveFirst
Call viewdata
End If
cmdsave.Enabled = False
End Sub
Private Sub viewdata() '浏览数据
On Error Resume Next
Text1(0).Text = rs.Fields("TitleId")
Text1(1).Text = rs.Fields("Subject")
Text1(2).Text = rs.Fields("Author")
Text1(3).Text = rs.Fields("Title")
Text1(4).Text = rs.Fields("Price")
Text1(5).Text = rs.Fields("quantity")
End Sub
Private Sub cmdadd_Click() '增加记录
For i = 0 To 5
Text1(i).Text = ""
Next i
Text1(0).SetFocus
cmdadd.Enabled = False
cmddelete.Enabled = False
cmdedit.Enabled = False
cmdsave.Enabled = True
cmdmove(0).Enabled = False
cmdmove(1).Enabled = False
cmdmove(2).Enabled = False
cmdmove(3).Enabled = False
End Sub
Private Sub cmddelete_Click() '删除记录
Dim myval As String
myval = MsgBox("是否要删除该记录?",vbYesNo)
If myval = vbYes Then
mysql = "delete from Titles where TitleId='"
mysql = mysql + Text1(0).Text + "'"
cnn.Execute mysql
rs.Close
sql = "select * from Titles"
rs.Open sql,cnn,adOpenDynamic,adLockOptimistic
If rs.BOF And rs.EOF Then
MsgBox "表中无记录!"
Else
rs.MoveFirst
Call viewdata
End If
End If
End Sub
Private Sub cmdedit_Click() '修改记录
Dim myval As String
Text1(0).Locked = True 'TitleId是主键,不能修改
mysql = "update Titles set Subject='" + Text1(1).Text + "',Author='"
mysql = mysql + Text1(2).Text + "',Title='"
mysql = mysql + Text1(3).Text + "',price="
mysql = mysql + Text1(4).Text + ",quantity="
mysql = mysql + Text1(5).Text + " where TitleId='" + Text1(0).Text + "'"
cnn.Execute mysql
MsgBox "修改完毕!"
Text1(0).Locked = False
End Sub
Private Sub cmdsave_Click() '保存记录
Dim mysql As String
If Text1(0).Text = "" Then
MsgBox "编号不能为空!"
Text1(0).SetFocus
Exit Sub
End If
Dim rstemp As New ADODB.Recordset
Dim strtemp As String
strtemp = "select * from Titles where TitleId='" & Trim(Text1(0).Text) & "';"
rstemp.Open strtemp,cnn,adOpenDynamic,adLockPessimistic
If Not rstemp.EOF Then
MsgBox "编号不唯一,重新输入!"
Text1(0).Text = ""
Text1(0).SetFocus
rstemp.Close
Exit Sub
End If
rstemp.Close
mysql = "insert into titles (titleId,Subject,Author,title,price,quantity) values ('"
mysql = mysql + Text1(0).Text + "','"
mysql = mysql + Text1(1).Text + "','"
mysql = mysql + Text1(2).Text + "','"
mysql = mysql + Text1(3).Text + "',"
mysql = mysql + Text1(4).Text + ","
mysql = mysql + Text1(5).Text + ")"
cnn.Execute mysql
MsgBox "保存成功!"
'刷新新增加的记录
rs.Close
sql = "select * from titles"
rs.Open sql,cnn,adOpenDynamic,adLockOptimistic
rs.MoveLast
Call viewdata
cmdsave.Enabled = False
cmdadd.Enabled = True
cmdedit.Enabled = True
cmddelete.Enabled = True
cmdmove(0).Enabled = True
cmdmove(1).Enabled = True
cmdmove(2).Enabled = True
cmdmove(3).Enabled = True
End Sub
Private Sub cmdmove_Click(Index As Integer) '记录指针移动
On Error Resume Next
Select Case Index
Case 0
rs.MoveFirst
Case 1
rs.MovePrevious
If rs.BOF Then rs.MoveFirst
Case 2
rs.MoveNext
If rs.EOF Then rs.MoveLast
Case 3
rs.MoveLast
End Select
Call viewdata
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub