学生信息管理系统之模块的理解
ExecuteSQL的定义'传递参数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函数的定义过程,它的目的就是执行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
这是典型的单个退出点。当执行正确的时候就直接退出了Exit Function,如果出错了才执行错误处理语句。单个退出点的作用就是确保出错时才执行错误处理语句。 说说遇到的问题:昨天上午和佳翰讨论时,他的代码部分"INSERT,DELETE,UPDATE"都用的小写,但是后边缺家了Ucase,我们在调试delete语句的时候怎么也不执行Else之前的语句,后来找了焕月师姐她说转换成大写肯定找不到从前边找到delete,所以就不执行。 - 20楼han_yankun20092小时前
- 支持
- 19楼zhanglianhai5552小时前
- 强悍,支持一下!
- Re: ggibenben13142小时前
- 太强悍了,哈哈
- 18楼hejingyuan62小时前
- 呵呵,支持
- Re: ggibenben13142小时前
- 嘿嘿
- 17楼leihengxin4小时前
- 加油。
- Re: ggibenben13142小时前
- 谢谢
- 16楼duskysea4小时前
- 不错
- 15楼lantingxv_jing6小时前
- 我都还没有做到这里呢,,,,
- Re: ggibenben13145小时前
- 我觉得应该先敲模块
- 14楼dandanzmc昨天 22:15
- 嘻嘻,呵呵
- Re: ggibenben1314昨天 23:39
- 小丫头
- 13楼a137151062昨天 19:58
- 加油
- Re: ggibenben1314昨天 20:03
- 向刚哥学习
- 12楼lishehe昨天 19:10
- 顶学习了
- Re: ggibenben1314昨天 19:10
- 向社河学习
- 11楼xvshu昨天 18:59
- 加油!加油!加油!
- Re: ggibenben1314昨天 19:03
- 谢谢
- 10楼yi_zz昨天 18:34
- 继续努力呀~
- Re: ggibenben1314昨天 18:34
- 一定
- 9楼liujiahan629629昨天 17:37
- 这个讨论讨论记得挺清楚的!
- Re: ggibenben1314昨天 17:48
- 就是就是
- 8楼han_yankun2009昨天 16:50
- 不错,学习了
- Re: ggibenben1314昨天 16:50
- 嘿嘿
- 7楼yueyangxiaoliang昨天 15:02
- 学习一下
- Re: ggibenben1314昨天 16:50
- 互相学习
- 6楼lyg673770712昨天 14:31
- 晓哥剖析的很深刻呀
- Re: ggibenben1314昨天 14:50
- 嘿嘿还行吧
- 5楼wj8023昨天 14:23
- 学习了,加油!
- Re: ggibenben1314昨天 14:23
- 嘿嘿
- 4楼liutengteng130昨天 11:52
- 支持。
- Re: ggibenben1314昨天 11:52
- 嘿嘿谢啦
- 3楼lfmilaoshi昨天 11:51
- 还要系统的写文章。文章太过于零散。。。米老师
- Re: ggibenben1314昨天 11:51
- 嗯知道了
- 2楼jiudihanbing昨天 11:46
- 学生信息管理系统…… 好熟悉的项目。总结的不错。代码的注释写的也不错! 加油……
- Re: ggibenben1314昨天 11:48
- 向师哥学习
- 1楼cjr15233661143昨天 11:42
- 理解的真透呀
- Re: ggibenben1314昨天 11:43
- 是师傅讲的透,自己看也看不懂
- Re: ggibenben13142小时前
- 太强悍了,哈哈
- Re: ggibenben13142小时前
- 嘿嘿
- Re: ggibenben13142小时前
- 谢谢
- Re: ggibenben13145小时前
- 我觉得应该先敲模块
- Re: ggibenben1314昨天 23:39
- 小丫头
- Re: ggibenben1314昨天 20:03
- 向刚哥学习
- Re: ggibenben1314昨天 19:10
- 向社河学习
- Re: ggibenben1314昨天 19:03
- 谢谢
- Re: ggibenben1314昨天 18:34
- 一定
- Re: ggibenben1314昨天 17:48
- 就是就是
- Re: ggibenben1314昨天 16:50
- 嘿嘿
- Re: ggibenben1314昨天 16:50
- 互相学习
- Re: ggibenben1314昨天 14:50
- 嘿嘿还行吧
- Re: ggibenben1314昨天 14:23
- 嘿嘿
- Re: ggibenben1314昨天 11:52
- 嘿嘿谢啦
- Re: ggibenben1314昨天 11:51
- 嗯知道了
- Re: ggibenben1314昨天 11:48
- 向师哥学习
- Re: ggibenben1314昨天 11:43
- 是师傅讲的透,自己看也看不懂