时刻谨记,对象的创建是需要开销的,当可以重用一个对象的时候(例如Command对象,当执行不同的命令时,只需要把CommandText换掉就可以了),毫不犹豫的使用它。
使用Insert,Update,Delete语句后,可以查询影响的行数来确定操作是否成功了,如果失败了,可以使用Err.Raise来引发一个错误。
Access中支持在数据库中产生和存储SQL语句,想了解更多的可以参看其它资料。
SQL语句中,可以使用IIF简单的进行一些替换处理。
使用ADO访问SqlServer中的数据 连接字符串示例:
'常见的两种SqlServer连接字符串形式
Public Const SQLConnection1 As String = _ \ & _
\ & _ \ & _ \ & _ \
Public Const SQLConnection2 As String = _ \ & _
\ & _ \ & _ \
除了连接字符串外,Sqlserver由于有存储过程(Stored Procedures),所以
在Command对象的CommandText中就可以放入存储过程的名字,然后使用CreateParameter方法创建参数,并通过Parameters.Append方法加入到参数集合中使用。这种调用方式效率比较高,当多次需要调用一个存储过程的时候,推荐这么使用。
Set gobjCmd = New ADODB.Command
Set gobjCmd.ActiveConnection = gobjConn '与文本形式的SQL语句最大的不同就是这里
gobjCmd.CommandText = \ gobjCmd.CommandType = adCmdStoredProc
'添加参数,注意第一个参数总是返回值 gobjCmd.Parameters.Append _
gobjCmd.CreateParameter(\, adInteger, _ adParamReturnValue, 0) gobjCmd.Parameters.Append _
gobjCmd.CreateParameter(\, adVarWChar, _ adParamInput, 40)
gobjCmd.Parameters.Append _
gobjCmd.CreateParameter(\, adVarWChar, _ adParamInput, 24)
'给参数赋值
gobjCmd.Parameters(\).Value = \ gobjCmd.Parameters(\).Value = \
'执行存储过程
gobjCmd.Execute Recordsaffected:=lNumAffected, Options:=adExecuteNoRecords
'验证信息
If lNumAffected <> 1 Then
Err.Raise Number:=vbObjectError + 1024, _
Description:=\
'获取返回的主键信息
lKeyValue = gobjCmd.Parameters(\).Value
Debug.Print \ & CStr(lKeyValue)
由于存储过程会作为Connection的动态方法存在,所以简单使用存储过程,
特别是只使用很少次的时候,也可以像下面例子这样,直接调用,不过这种方式效率比较低,还是推荐使用上面Command包装的调用方法。
objConn.spGetCustomerNames \
需要注意的是无论何种情况下,Parameters集合的第一个元素都是代表存储
过程的返回值,不管实际上这个存储过程有没有返回值。
Sqlserver是支持返回多个结果集的,下面是典型的结果集操作:
'假设这个存储过程只返回2个结果集 Do While Not rsData.EOF '执行相关赋值 rsData.MoveNext Loop
'切换不同的数据集
Set rsData = rsData.NextRecordset
Do While Not rsData.EOF
'执行相关赋值,例如给下拉列表赋值
'ddShippers.AddItem rsData.Fields(1).Value rsData.MoveNext Loop
'这里注意使用NextRecordset关闭和销毁了Recordset,不需要额外的操作了 Set rsData = rsData.NextRecordset
使用Connection的时候,通常的目标是尽快访问数据库,尽快再关闭连接。然而很多时候这些数据保存在Recordset中一直使用是可以提高程序效率的,这个时候我们需要的是非连接型的Recordset。这个在ADO中是支持的,你可以从数据库中获得Recordset,然后关闭连接,在内存中保存Recordset并一直使用,然后也可以重新连接更新数据,甚至可以保存Recordset中的数据到别的地方。下面描述的就是一个非连接型Recordset的设置方式:
szSQL = \ ' 创建非连接型Recordset的步骤 ' 1) 创建Recordset对象.
Set grsData = New ADODB.Recordset ' 2) 游标位置设为Client.
grsData.CursorLocation = adUseClient ' 3) 游标类型设为Static.
grsData.CursorType = adOpenStatic ' 4) 锁的类型设为batch optimistic.
grsData.LockType = adLockBatchOptimistic ' 5) 打开记录集.
grsData.Open szSQL, gobjConn, , , adCmdText ' 6) 把Recordset的ActiveConnection设为Nothing. Set grsData.ActiveConnection = Nothing
Sheet1.Range(\).CopyFromRecordset grsData
注意上面的grsData是定义为Public类型的:Public grsData As ADODB.
Recordset。获得到这个对象以后,就可以使用Filter,Sort等手段,获取需要的数据。
不用怀疑,利用ADO去处理下面两种非关系型数据(但是是格式化的数据)那是非常方便的,因为SQL语句是强大的,可以完成很多的查询,筛选功能。 使用ADO访问Excel中的数据 连接字符串示例:
ExcelConnect = \ & _ \ & _ \
注意访问Access与Excel的连接字符串中,Provider是相同的;但是Excel需要多加上Extended Properties,这里的版本号随着Excel的版本不同而不同。 使用的SQL语句与Access中基本相同,除了以下几点:
' 使用Sheet名字作为表名的时候需要加$符号和方括号
' 如果Sheet名字中有空格的,名字两边可以用单引号括起来,例如:['My Sheet'$] sSQL1 = \
' 如果表名是Sheet级别的名字,可以把这个表名接在$符号后面 sSQL2 = \ ' 如果表名是一个Range范围,也直接加在$符号后面 sSQL3 = \
' 如果表名是一个Workbook级别的名字,可以直接使用 sSQL4 = \
注意了,OLE DB默认认为Worksheet中的第一行是列名,而不是数据。如
果不是这种情况,那么需要告诉OLE DB,第一行也是数据,这个时候需要在连接字符串中的Extended Properties中加上“HDR=No”。如下列所示:
sConnect = \ & _ \ & _ \ '注意上面的引号数目
使用ADO访问Text中的数据
对于含有大量格式化的文本数据,例如csv文件,使用ADO简直就是如鱼得水,你能充分享受SQL带来的强大便捷性。 连接字符串示例:
sConnect = \ & _ \ & _ \
注意了,Provider与访问Excel是一样的,不同的是,为了方便处理多个这样的文件,连接字符串中不需要提供文件名字;而在SQL语句中的表名,使用的是文件名。如下面的例子:
sSQL = \
同样的,OLE DB默认认为文件中的第一行是列名,而不是数据。如果不是这种情况,那么需要告诉OLE DB,第一行也是数据,这个时候需要在连接字符串中的Extended Properties中加上“HDR=No”,参考上面的设置。
到这里,基本的ADO操作已经总结完了,但是ADO的功能绝对不仅仅如此,它还包括另外一大块内容,那就是RDS编程模型。RDS模型解决的是网络数据访问问题,这个在Excel中比较少见,这里就不重点介绍了,有兴趣的可以自己琢磨琢磨看。