'传递参数SQL传递查询语句,MsgString传递查询信息。自身以一个数据集对象的形式返回
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
Dim Cnn As ADODB.Connection '定义连接
Dim Rst As ADODB.Recordset
Dim sTokens() As String '定义字符串
On Error GoTo ExecuteSQL_Error '异常处理
sTokens = Split(SQL) '用Split函数产生一个包含各个子串的数组
Set Cnn = New ADODB.Connection '创建连接
Cnn.Open ConnectString
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then '判断字符串中是否含有指定内容
Cnn.Execute SQL '执行查询语句
MsgString = sTokens(0) & "query successful" '返回查询信息
Else
Set Rst = New ADODB.Recordset '闯将数据集对象
Rst.Open Trim$(SQL), Cnn, adOpenKeyset, adLockOptimistic '返回查询结果
Set ExecuteSQL = Rst '返回记录集对象
MsgString = "查询到" & Rst.RecordCount & " 条记录"
End If
ExecuteSQL_Exit:
Set Rst = Nothing '清空数据集对象
Set Cnn = Nothing '中断连接
Exit Function
ExecuteSQL_Error: '判断错误类型
MsgString = "查询错误:" & Err.Description
MsgBox MsgString
Resume ExecuteSQL_Exit
ExecuteSQL的定义
上面是模块中ExecuteSQL函数的定义过程,它的目的就是执行SQL语句。那它是怎样的逻辑呢?
首先它运用了一个Split函数,在msdn中查找它的意思就是返回一组下标为0的数组。
看一个例子:
写一句SQL语句:"select * from student_Info"
执行sTokens=Split(SQL)
sTokens(0)="select"
sTokens(1)="*"
sTokens(2)="from"
sTokens(3)="student_Info"
这样就把一个查询语句拆分成了一个数组
然后看InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0)))这句话,InStr函数在msdn中的解释:
InStr([start, ]string1, string2[, compare]),下标从1开始
返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中,从start开始找string2,省略start时 从string1头开始找。找不到时,函数值为0。
因为SQL语句中最常用的就是 SELECT,INSERT,DELETE,UPDATE,所以这句话的意思就是在"INSERT,DELETE,UPDATE"中查找SQL语句开头的单词,如果能够找到就执行下边的语句,如果找不到就执行Else中的语句。
大家肯定会疑惑为什么红色字部分没有SELECT,原因是现在这个语句的功能是单纯地判断是不是Select语句,如果是就执行Else。
最后看ExecuteSQL_Exit:
Set Rst = Nothing '清空数据集对象
Set Cnn = Nothing '中断连接
Exit Function
Set Rst = Nothing '清空数据集对象
Set Cnn = Nothing '中断连接
Exit Function
这是典型的单个退出点。当执行正确的时候就直接退出了Exit Function,如果出错了才执行错误处理语句。单个退出点的作用就是确保出错时才执行错误处理语句。
说说遇到的问题:昨天上午和佳翰讨论时,他的代码部分"INSERT,DELETE,UPDATE"都用的小写,但是后边缺家了Ucase,我们在调试delete语句的时候怎么也不执行Else之前的语句,后来找了焕月师姐她说转换成大写肯定找不到从前边找到delete,所以就不执行。