诸君好,我们今天聊Connection对象的Execute方法;该方法可以向数据库提交查询,比如SQL语言,是我们系列教程中经常使用到的——其语法如下:Connection.Execute CommandText,RecordsAffected, Options第1个参数CommandText为字符串类型,是必须的,用来指定提交的查询,比如SQL语句。第2个参数RecordsAffected是可选的输出参数,用来指定查询影响的行数。第3个参数Options也是可选参数,用于指定命令类型和可能的CommandTypeEnum值的详细信息。第2~3参数,作为新手我们基本用不到,所以就当没看到。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 = Nothing End Sub 使用Connection的Execute的方法执行SQL语句,不管是否使用到该方法返回的Recordset对象,均不需要使用代码关闭相关Recordset对象(rst.Close),例如上述示例。 尽管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章讲到该方法。
|