09-Excel VBA 学习总结 - 通用ADO数据访问模型(2)

2019-05-26 22:57

时刻谨记,对象的创建是需要开销的,当可以重用一个对象的时候(例如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中比较少见,这里就不重点介绍了,有兴趣的可以自己琢磨琢磨看。


09-Excel VBA 学习总结 - 通用ADO数据访问模型(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:水库大坝安全管理应急预案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: