分享

Excel VBA ADO SQL入门教程022:Connection对象的Execute方法

 L罗乐 2020-01-29
1.
诸君好,我们今天聊Connection对象的Execute方法;该方法可以向数据库提交查询,比如SQL语言,是我们系列教程中经常使用到的——其语法如下:
Connection.Execute CommandText,RecordsAffected, Options
第1个参数CommandText为字符串类型,是必须的,用来指定提交的查询,比如SQL语句。
第2个参数RecordsAffected是可选的输出参数,用来指定查询影响的行数。
第3个参数Options也是可选参数,用于指定命令类型和可能的CommandTypeEnum值的详细信息。
第2~3参数,作为新手我们基本用不到,所以就当没看到。
 
2.
Execute方法有两种使用形式。一种是Cnn.Execute SQL;另一种是Cnn.Execute(SQL)。
没错。两者看似一样,但以鲁迅他老人家两棵枣树般寂寞的情怀发誓,其实并不一样后者比前者多了一对括号……
当Execute执行的SQL语句是不需要返回记录集时,例如对数据库数据的删除、新增、更新等,Execute方法的参数,既可以加括号,也可以不加括号,比如:
Cnn.Execute 'delete from 成绩表 where 姓名='马可波罗''
也可以写成:
Cnn.Execute ('delete  from 成绩表 where 姓名='马可波罗'')
而当Execute指定的SQL语句是需要返回记录集,也就是SELECT查询语句时,由于VB语法规定带返回值的调用其参数必须加括号,因此就需要对SQL语句加上一对括号了。
……
举个例子:
Sub DoExecute2() Dim cnn As Object, rst As Object Dim i As Long, Sql As String Set cnn = CreateObject('adodb.connection') cnn.Open 'Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=' & ThisWorkbook.FullName '创建到代码所在工作簿的连接,Excel版本非03版 Sql = 'select * from [成绩表$]' 'Sql语句 Set rst = cnn.Execute(Sql) 'Execute执行Sql语句 Cells.ClearContents For i = 0 To rst.Fields.Count - 1 '遍历获取记录集中的标题 Cells(1, i 1) = rst.Fields(i).Name Next Range('a2').CopyFromRecordset rst '获取记录集中的记录 cnn.Close '关闭连接 Set cnn = Nothing '释放内存End Sub
上面的代码Set rst = cnn.Execute(Sql),得到一个新的、只读属性的Recordset记录集,该记录集由标题和记录行两部分构成;我们通过遍历循环的方式,将该记录集的标题名(Fields.Name)依次放置到表格的第1行;并使用单元格的CopyFromRecordset方法,将查询记录放置到右上角为A2单元格的区域内。
当然,如果我们并不需要获取标题之类的信息,只是需要获取查询记录,也可以不使用rst对象,代码会相当简洁。
Sub DoExecute3()    Dim cnn As Object    Dim i As Long, Sql As String    Set cnn = CreateObject('adodb.connection')    cnn.Open 'Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=' & ThisWorkbook.FullName    '创建到代码所在工作簿的连接,Excel版本非03版    Sql = 'select * from [成绩表$]' 'Sql语句    Cells.ClearContents    Range('a2').CopyFromRecordset cnn.Execute(Sql)    'Execute执行Sql语句,CopyFromRecodset获取记录集中的记录    cnn.Close    Set cnn = NothingEnd Sub

小贴士:
使用Connection的Execute的方法执行SQL语句,不管是否使用到该方法返回的Recordset对象,均不需要使用代码关闭相关Recordset对象(rst.Close),例如上述示例。

3.
尽管Execute方法可以向数据库提交SQL语句,且语句十分简单,但它也有很多的局限性……周杰伦:听妈妈的话,妈妈说便宜没好货……
当Execute执行的是SQL的改、增、删语句时,返回的Recordset对象是关闭的;而当执行SQL的SELECT查询语句时,总是返回一个新的Recordset对象,且该对象属性只读、游标仅向前……我们后面会讲到如何在Recordset记录集内,操纵数据的增加、删除等,如果Recordset属性只读,则此类许多操作也就无意义了。
另外,Execute方法返回的Recordset对象的方法和属性也有很多的局限性;有些属性方法用不了,还有些属性方法用了会出错。比如,我们无法使用rst.RecordCount来判断查询的结果集是否为空、条目多少,它的rst.RecordCount结果始终返回-1;倘若需要判断查询结果是否含有记录,通常使用以下语句:
If Not (rst.BOF And rst.EOF) Then MsgBox '查有结果'Else MsgBox '查无结果'End If
……
因此,Execute方法最适合执行操作查询,也就是增、改、删的SQL语句,这些语句我们通常并不需要获取及操作Recordset对象;而如果我们是执行查询语句,并需要对Recordset记录集灵活而丰富的使用,通常建议使用Recordset的Open方法……我们应该会在第25章讲到该方法。
……
没了

致安
 系统学习Excel,推荐加入我的Excel社群



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多