ADO.Net的对象模型

来源:互联网 发布:linux从入门到精通ppt 编辑:程序博客网 时间:2024/04/27 17:06

ADO.Net的对象模型,包括以下七个对象。

Connection.Command,Parameter,Recordset,Field,Property,Error.此外,还包括四个集合,Fields,Properties,Parameters,Errors.

这几个对象的功能如下:Connection对象提供与包含路径,口令和连接选项的数据源的链接;Command对象保存一个针对数据源的将被执行的命令,最常见的是SQL命令或存储过程;Recordset对象保存在记录集中执行查询参数的记录以及漫游记录的光标;Error对象包含关于数据访问期间可能发生错误的错误信息;Parameter对象存储由Command对象使用的单个参数;Field对象为记录集中包含的所有字段集合;Property对象是由Data Provider驱动程序返回的数据源的属性。

ADO的核心是Connection,Recordset,Command对象。这三个对象可独立使用,也可互相连接使用。而其他对象,如Error集合存储在Connection对象中,在使用这些对象前都必须先声明对象变量,然后用Set进行赋值,才可使用,在声明时还可以用WithEvents将事件也声明进来,使得ADO对象变得象控件那样易于使用。有两个对象中包含了事件,即Recordset对象和Connection对象。只要如Dim WithEvents rst As ADODB.Recordset这样声明后,就能在代码窗口的下拉表中找到该对象,真的和ADO控件一样易于使用,连事件也大致相同。

----------------------------------

Connection对象
用于建立与数据源的连接(包括客户机/服务器结构的连接)。在大多数应用程序中最好把一个Connection对象保存为全局级或模块级,这样就不用每次执行一个操作时都去创建这个对象。
属性:
★ ConnectionString属性:连接数据源的字符串,包含了各种所需信息。如指定与1个ODBC数据源(DSN)为mine的连接,连接字符串可写为:
Dim cn as ADODB.connection
Set cn=New ADODB.connection
cn.ConnectionString="DSN=mine;UID=an;PWD=pwd"
如果不使用ODBC数据源,则连接字符串需要按以下方式设置:
cn.ConnectionString="driver={SQL Server};server=mm;uid=sa;pwd=pwd;" & "Database=mine"
上面这个是连接到远程SQL Server的连接串,即依次说明OLE DB驱动,服务器名,用户名和密码及数据库名称。如:cn.ConnectionString=”driver={SQL Server};server=www.ndlxn.com;uid=ndlxn;pwd=848484;Database=pubs”
ConnectionString用多项“设置项=值”的方式来设定与数据源的连接,每个项之间用分号隔开。对于连接字符串的写法,精确固定的语法是没有的。因为不同类型数据库,有各自的设置项。一个技巧是先在窗体上放一个Adodc控件,然后利用其ConnectionString设置时的对话框来建立好字串,再粘贴到代码中,最后将Adodc控件删除。不要以为这是很笨的方法哦,许多高手也采用它哩。
★ ConnectionTimeout属性:设置连接时的最长等待时间,缺省为15秒,超时还未连接成功的话,中止连接,并返回出错信息。
★Mode属性:指定了该connection对象的读写权限,该属性值为枚举变量ConnectionModeEnum中的一个,有adModeRead、adModeReadWrite等。到对象浏览器中去找。
★CursorLocation属性:选择不同的游标位置,只能在建立连接之前设置该属性,并建立连接才有效,对于1已经建立的连接,设置该属性对连接不会产生影响。该属性有以下常量:adUseNone——不使用游标服务;adUseClient——使用客户端游标;adUseServer——使用服务端游标。
★ DefaultDatabase属性:该属性为connection对象指定1个缺省的数据库。
★ State属性:查看一个connection对象当前状态是已经建立还是关闭。只读。
★ Version属性:返回ADO的版本号。
★ Attributes属性:设置事务的处理方式,可选值AdXactCommitRetaining通过自动调用 CommitTrans 启动新事务。或AdXactAbortRetaining通过自动调用 RollbackTrans 启动新事务 。
★ CommandTimrout属性:终止操作数据源的命令并返回一个错误的等待时间。
★ Provider属性:返回连接的数据源(即数据提供者)的名字。
★ Errors属性:Error对象实际是一个与Connection平行的对象,也有一些如Description和Number等属性,但它的集合包含在Connection对象下,其中包含了全部错误对象,需要先声明一个ADODB.Error对象,然后用Set进行赋值,如Dim cnerr As ADODB.Error Set cnerr = DataEnvironment1.Connection1.Errors.Item(0)。

方法:
★ Open方法:建立与数据源的物理连接。格式:
connection.Open ConnectionString,UserID,Password,Options
注意:该方法是使Connection获得初始化的方法,只有使用了该方法,Connection对象才真正在内存中存在。
后面的参数都是可选参数,最简单如:cn.Open(cn是1个connection对象),但如果这样则需要预先设置好ConnectionString等参数。其中,connectionstring是前面提到的连接字符串,UserID是建立连接的用户的代号,Password是建立连接的用户的密码。该参数会覆盖掉在连接字符串中设置的密码;options提供了连接选择,可选值只有adAsyncConnect异步连接,缺省为-1同步连接。

★Close方法:关闭1个数据连接对象,使该连接对象只留在本机内存中,可对其属性更改后再重新建立连接。(注:如果不是关闭对象,而是将对象从内存中清除,应使用 Set connection对象变量=Nothing.).

★ 获取数据源上的有关信息:OpenSchema方法,该方法获取与数据源有关的信息,如获取数据源中所有表的名称等。格式:Set Recordset对象=cn.OpenSchema(查询类别,[明细条目])。两个参数都是常数值,其中,每个查询类别中包含多个明细条目,每个明细条目作为返回的Recordset的一个字段,可以省略第二个参数,这时返回指定类别下的所有明细条目的信息生成一个Recordset。例如类别为“表”adSchemaTables常数中包含了TABLE_NAME(表名称)和TABLE_TYPE(表类型)等多个明细项目常数,而主要应了解类别常数adSchema…以得到数据源某方面信息,可以查对象浏览器。举例如下(得到所有表名):
Dim rstSchema As ADODB.Recordset
Private Sub Form_Load()
DataEnvironment1.Command1 '初始化数据环境
Set rstSchema = DataEnvironment1.Connection1.OpenSchema(adSchemaTables)
Do While Not rstSchema.EOF '获取所有表名
List1.AddItem rstSchema.Fields("TABLE_NAME")
rstSchema.MoveNext
Loop
Set MSHFlexGrid1.DataSource = rstSchema '可看到更多信息。
End Sub

★ Execute方法:执行1个SQL查询,既可是选择查询,也可是动作查询。如:
cn.Execute "Delete From BB where 姓名 like '嫖客店'"
但要注意:使用Connection对象的Execute方法返回的游标类型是最基本的只能读和只能向前移动的游标adOpenForwardOnly,因此,如果该方法执行一个选择查询返回一个记录集时特别要明白。
举一个完整的例子如下:
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Private Sub Command2_Click()
rst.MoveNext
Print rst("姓名")
End Sub
Private Sub Form_Load()
Set cn = New ADODB.Connection
Set rst = New ADODB.Recordset
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=C:/WINDOWS/Desktop/lxn.mdb" 连接字符串
cn.Open 连接
cn.Execute "Delete From BB where 姓名 like '嫖客店'" 动作查询
Set rst = cn.Execute("Select * from BB") 选择查询,生成记录集
Do While Not rst.EOF
List1.AddItem rst("姓名")
rst.MoveNext
Loop
End Sub

★ 事务处理方法:BeginTrans:开始1个事务;
CommitTrans:提交事务,将事务中的操作写入数据源。
RollBackTrans:滚回事务,取消操作。
当同时更新多个表时,为了保证数据一致性而必须使用事务,比如有两个表,一个是支出表,一个是余额表,当支出一项费用时,支出费用增加,余额减少,需要对这两个表同时更新,但如果不用事务,倘若在更新支出表后发生错误,则余额表没有更新,不合要求。这时就要把它们封存装到一个事务里。确保多表操作的完整性。此外,也可以用它对同一个表的多步操作进行封装,使多步操作成为单个单元。
一般地,我们在BeginTrans处加一条On Error Goto ErrNum的出错捕获语句,然后在错误处理程序中使用RollBackTrans取消事务。形如:
cn.BeginTrans
on Error Goto ErrNum
…更新表1
…更新表2

cn.CommitTrans
Exit Sub
ErrNum:
cn.RollBackTrans
msgbox 出错提示
事务可以嵌套,由begintrans方法返回1个长整数表示当前事务是第几层,如返回1为当前事务不包含在任何事务中。CommitTrans和RollBackTrans结束最近的BeginTrans打开的那个事务。在程序中用begintrans开始1个事务后,应使用committrans或rollbacktrans方法结束,如果不用,则在程序结束后事务全部滚回,也就是说,系统不会自动去提交任何事务。例:
cn.BeginTrans
rst.MoveNext
cn.Execute "insert into BB values('嫖客店','aaa',0,'0','0',0,'0')"
cn.CommitTrans
有两种情况需要说明一下:在事务中也可能出现问题,导致被迫放弃事务:一种情况是一个关健字段被锁定,不能进行写操作;另一种情况是字段值超出范围,如字段为Integer,但实际值大于32767,字段为Text,但值字串长超过32K等,这样会导致事务强迫放弃。

-----------------------------------------------

Command对象:
命令对象:可完成对数据库的定义,修改,数据的查询。

★ ActiveConnection属性:从属于哪一个connection对象。要用Set赋值,如:Set cmd.ActiveConnection=cn.创建一个command对象时指明该对象从属于哪一个connection对象。如果事先没有建立Connection对象,则将该属性直接指定一个连接串,ADO将为这个Command对象创建新的隐含的Connection对象,并将该字符串作为ConnectionString自动建立起连接。可以为一个connection连接对象创建多个command命令,只需要将每个command命令对象的activeconnection属性都为该connection对象名,如:
Dim cmd as ADODB.command
Set cmd=New ADODB.command
Set cmd.ActiveConnection=cn (说明:cn是前面举例的connection对象)
★ CommandText属性:命令内容,为1条SQL选择或动作查询,或表名等。如:
cmd.CommandText="DELETE FROM students WHERE ID=98001"
★ CommandTimeout属性:等待命令执行完的最长时间,超时将中止该命令。如:
cmd.CommandTimeout=20 (单位为秒。)
★ CommandType属性:command对象的类型,可选值有:adCmdText(SQL语句),adCmdTable(表),adCmdStoredProc(存储过程)缺省为adCmdUnknow未知命令类型。例:
cmd.CommandText="BB"
cmd.CommandType=adCmdTable (是一张表)
★ Prepared属性:第1次执行时是否进行编译,以提高以后的执行速度。如:
cmd.Prepared=True表示进行命令的预编译,提高以后的执行速度。
★ Execute方法:执行命令。有两种情况,如果命令会返回记录,如Select或干脆就是1个表名等,则要将返回记录(当作记录集)赋予1个Recordset对象,格式为
Set Recordset对象=command对象.Execute()
如果命令不返回记录(如Update,Delete等),则直接用"command对象.Execute"即可。
★ State属性:对象的当前状态,可能值有:adStateClosed对象已关闭;adStateOpen对象已打开;adStateConnecting对象正在连接;adStateExecuting正在执行命令;adStateFetching表明Recordset对象的行正在被取回。State属性实际是一个通用属性,因为在连接对象Connection,命令对象Command,记录集Recordset中都有这个属性。
★ CreateParameter方法和Parameters集合:创建1个新的Parameter对象,如果CommandText(命令)是带参数的SQL Server存储过程,可用此方法创建参数对象,格式:
Set parameter对象= command对象.CreateParameter(对象名name,参数类型type,输入/输出参数direction,参数长度size,参数值value)
其中,Type指定对象值的数据类型如adInteger,adVariant等;Direction参数指定参数类型,可选值有adParamUnknown未知;adParamInput输入参数;adParamoutput输出参数;adParamInputOutput输入/输出参数;adParamReturnValue是一个返回值参数。
Size参数指定对象值的最大长度。
Value:对象的值。
用CreateParameter方法仅在内存中创建参数对象,并不真正包含进Command对象中,要用命令对象中Parameters集合的Append方法添加上,才算真正建立。格式:Command对象.Parameters.Append Parameter对象变量。
我们通常在打开SQL Server上带参数的存储过程时使用此方法传送所需参数,例如:
Dim cn as ADODB.Connection
Dim cmd as ADODB.Command
Dim rst as ADODB.Recordset
Dim param as ADODB.Parameter
Set cn=New ADODB.Connection
cn.Open “driver={SQL Server};server=www.ndlxn.com;uid=ndlxn;pwd=848484;
database=pubs”
Set cmd=New ADODB.Command
cmd.ActiveConnection=cn
cmd.CommandText=”mystoredinsqlserver” 存储过程的名称。
cmd.CommandType=adCmdStoredProc
Set param=cmd.CreateParameter(“par1”,adBoolean,adParamReturnValue)
cmd.Parameters.Append param
Set param=cmd.CreateParameter(“par2”,adInteger,adParaminput,,Val(text1.text))
cmd.Parameters.Append param 下面只用一行也可以达到同样的添加参数目的。
cmd.Parameters.Append cmd.CreateParamter(“par3”,adInteger,adParamOutput)
Set rst=cmd.Execute
Msgbox rst(0).Value
Msgbox cmd(“par1”)
Msgbox cmd(“par3”)
这里,三个参数中,par1是一个返回值,par3是一个输出参数,可以在程序中显示出来。
参数查询例如我们想让程序运行时,由用户自己来输入commandtext命令的where参数值,建立1个Parameter对象,用如下的方式来创建和使用参数:
cmd.CommandText="DELETE FROM students WHERE ID BETWEEN ? AND ?"
其中的两个问号未直接给出值,相当于两个“变量”,要用Parameter参数对象。
Dim Par as ADODB.Parameter
Dim Par1 as ADODB.Parameter
Set Par =New ADODB.Parameter
Par.Name= “myid”
Par.Type=adInteger
par.size=5
par.value=98001 ‘只要赋予变量即实现用户控制,如par.value=cint(text1.text)
par.Direction=adParamInput
cmd.Parameters.Append par
Set Par1=New ADODB.Parameter
par1.name= ”my”
par1.type=adinteger
par1.size=5
par1.value=98008
par1.Direction=adParamInput
cmd.Parameters.Append par1
cmd.Execute
这段代码是查询students表中98001—98008之间的所有记录,在command对象cmd的变量集中的变量par,par1会自动依次代入两个?号。
在实际使用中,如果不知参数的类型,可设type为adVariant(变体),参数的name,
size和direction是可选属性,可用缺省值。再举1例:
Private Sub Command2_Click()
cmd.CommandText = "select * from BB where 姓名 like ?"
Set par = cmd.CreateParameter ("abc", adVariant, adParamInput, 6,Text1.text)
’Set par = New ADODB.Parameter 上面这一句顶这么多!
’par.Name = "abc"
’par.Size = 6
’par.Type = adVariant
’par.Value = Text1.Text
’par.Direction = adParamInput
cmd.Parameters.Append par
Set lxn = New ADODB.Recordset
Set lxn = cmd.Execute()
End Sub
★Cancel方法:取消一个未执行的,异步的Execute或Open方法的调用。前面讲过。

------------------------------

Recordset对象补充
★ CursorLocation属性:指定记录集的光标位置,有adUseServer和adUseClient两种。如果在connection对象连接前未指定游标,则必须在此设置。
★ CursorType属性:光标类型。
★ UpdateBatch方法:同时保存多条被更改的记录。
★ Open方法:建立1个记录集,格式:
Recordset.Open Source,Activeconnection,Cursortype,Locktype,Options
其中,Source即RecordSource参数可以是1个查询、存储过程名或表名等;或者1个Command对象变量名(此时要省略ActiveConnection参数,即为空),ActiveConnection参数指明该记录集基于哪个Connection连接对象,这个连接对象必须是已建立的连接,当没有Connection对象时,该参数就直接指定一个ConnectionString连接串;Cursortype指明游标类型,Locktype指明记录锁定方式(记录集是否可修改/只读),Options是说Source参数中内容的类型,如表,存储过程等,与Command对象的Commandtype类似。
例如:
rst.Open "students",cn,adOpenDynamic,adLockOptimistic,adCmdTable
使用Open方法,不要事先建立Connection和Command对象,也可打开数据源——其实,它们三个对象本来就是平行的嘛,如:
Dim rst As New ADODB.Recordset
Private Sub Form_Load()
Const cnStr = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=C:/工商所收费系统/MyDatabase.mdb"
rst.Open "select * from Unitrecord", cnStr, adOpenDynamic, adLockOptimistic
End Sub
只要这么几句,就打开一个记录集了。
★ Save方法:将记录集存为1个文件。本方法不会关闭记录集。格式:
recordset对象变量.Save 路径和文件名
该方法在记录集建立后才能使用。在第1次使用该方法存储记录集后,如果需要往同一文件存储同样的记录集,要省略文件名。
我在使用ADO对象时遇到1难题:竟没用来!我在声明段和Form_load事件中声明了对象变量,也设置了connectionstring,open属性,也给记录集对象赋予了Execute方法得到的记录,可是,记录集对象不可用,如:(红色代码为修改后的正确写法。)
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rst As ADODB.Recordset
rivate Sub Form_Load()
Set cn = New ADODB.Connection
cn.ConnectionString = "FILE NAME=C:/WINDOWS/Desktop/Savelink.UDL"
cn.CursorLocation=adUseClient
cn.Open
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cn
cmd.CommandText = "select * from sub1"
Set rst = New ADODB.Recordset
‘ Set rst = cmd.Execute() ‘缺省情况下,记录集为只读,如果要修改记录,需要设定记录集的LockType属性,或在记录集对象的OPEN方法中一并设置。
rst.Open "sub1", cn, adOpenDynamic, adLockOptimistic
(注:第1个参数”sub1”也可采用1个command对象名,但那样的话要省略后面cn,如下:
rst.Open cmd, , adOpenDynamic, adLockOptimistic)
Label2.Caption = "本过程共" & rst.RecordCount & "步。"
rst . addnew
rst(0) = "搞试验"
rst(1) = "我的实验"
rst.Update ‘这句不能丢!设为adLockOptimistic对记录的修改不会自动进行保存!!!!
End Sub
执行到label2.caption=…rst.RecordCount…和rst . addnew时就出错了,好象根本就没有rst似的。
为什么?缺省情况下,ADO对象中connection对象是无游标的,必须在open之前设置好其CursorLocation属性(也可以设置Recordset对象的CursorLocation属性),而用connection或command对象赋予的记录集是只读的,不能Addnew,要全面操作数据库必须用记录集的Open方法。

原创粉丝点击