大家好,今日继续讲解VBA与数据库解决方案的第10讲内容,打开一个指定的数据库记录集,把所得的数据显示到工作表中的方法。今日的内容是和第8讲,第9讲内容是相连续,在第9讲中讲了打开记录集的用的方法是rsADO.Open strSQL, cnADO, 1, 3,在第8讲中我们讲了还有一种是Execute(strSQL)方法,今日我们就讲利用这种方法达到我们的目的,同时在SQL语句中的我们将查询设置为一个动态的查询。
如下面的工作表文件:我们要根据I2单元格的提示部门信息来查找工作表的数据并将查询的结果放在左侧的区域:
![bb6c953565ef3e8e9f0040e757bc1e89.png](https://i-blog.csdnimg.cn/blog_migrate/d753268fd17889715a681dbbf40404b1.jpeg)
我们看代码:
Sub mynzra2()
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
strPath = ThisWorkbook.Path & "mydata.accdb"
Set cnADO = CreateObject("ADODB.Connection")
With cnADO
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open strPath
End With
strSQL = "SELECT * FROM 职员表 WHERE 部门= '" & Cells(2, 9) & " '"
Set rsADO = cnADO.Execute(strSQL)
Columns("A:E").Select
Selection.ClearContents
Cells(2, 9).Select
For i = 0 To rsADO.Fields.Count - 1
Cells(1, i + 1) = rsADO.Fields(i).Name
Next i
Range("A2").CopyFromRecordset rsADO
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代码截图:
![bb815aeccd92c7792aafa36794e822d2.png](https://i-blog.csdnimg.cn/blog_migrate/7e9696d9adb7d92413d9dbd3501be814.jpeg)
代码精讲:
① Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
strPath = ThisWorkbook.Path & "mydata.accdb"
Set cnADO = CreateObject("ADODB.Connection")
上面的代码和第9讲的相同,分别声明了几个变量并建立了数据库的ADO连接,
② 在打开数据库时同时设置了连接:
With cnADO
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open strPath
End With
这种连接方式采用了我在第8讲中讲到另外的方式,可以参考一下。
③strSQL = "SELECT * FROM 职员表 WHERE 部门= '" & Cells(2, 9) & " '"
我们要重点的讲解一下这条语句,之前有朋友联络问过这类语句的书写方式,今日可以一并回答,这里要注意变量,变量是代码中的变量,在SQL语句中是不能出现变量的,要是常量并用引号括起来,所以在上面的语句中
a "SELECT * FROM 职员表 WHERE 部门= '" 为第一部分
b 最后的 " '"为第三部分
c Cells(2, 9)为第二部分。
三个部分中间用"&"连接起来。大家要务必记住这种书写的方式,这样在程序的运行中SQL语句才正确,下面看看在运行过程中的SQL语句:
![5c35732152af061e230dcd0fed2d221a.png](https://i-blog.csdnimg.cn/blog_migrate/5de4eebf4dd2bc5751c2bc1093943df5.jpeg)
④ Set rsADO = cnADO.Execute(strSQL) 对于这条语句,我在第8讲的内容中,也讲到是一种打开记录集的方式之一,是Connection对象的Execute方法,通过上面语句,我们就可以执行查询,并将结果保存到集合的对象中。下面我将Connection对象的Execute方法再次专门的讲解一下:
ADODB.Connection对象的Execute方法
该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
第一种:执行SQL查询语句时,将返回查询得到的记录集。用法为:
Set对象变量名=连接对象.Execute("SQL语句")
Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
第二种:执行SQL的操作性语言时,没有记录集的返回。此时用法为:
连接对象.Execute "SQL语句" [,RecordAffected][, Option]
参数a RecordAffected为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
参数b Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效
在第9讲的讲解中,我们用了第二种方法,今日的代码有的是第一种代码。至于那种好,我这里没有说明,可以根据写代码人员的喜好即可。
代码的运行结果:
![61bfc82044ebd1ca60873c37e801022d.png](https://i-blog.csdnimg.cn/blog_migrate/2ce2fdba2e93d23991b20b6fda069f39.jpeg)
今日内容回向:
1 Connection对象的Execute方法有哪两种方法?
2 如何实现可控的指定查询?并将结果显示?