VB学习就此告一段落,顺利拉开了我的红皮书之旅,满心欢喜的我,先开始看红皮书,但这第一个例子并不是那么顺利,仅仅是红皮书的第一个例子就让我感觉到了细节的重要性,在敲的时候没有感觉到有什么需要特别注意的地方,但是一运行,问题就出现了,尽管把尽可能的错误都找到了,也都调整了,但依旧是无法正常登录,最后还是在军星小同学的帮助下,顺利的完成了这第一个例子,但最后一个错误,更是让我无语,也是一个特别特别不起眼的问题,但是却能影响到程序的运行,可见,没有一个细节是可以忽略的,要不断精细,不给程序钻空子的机会。接下来,我就给大家展示一下,这个例子以及由于粗心造成的一些小“惊喜”吧!
一、对实例1的整体认识
![红皮书实例1+实例2总结 红皮书实例1+实例2总结](https://i-blog.csdnimg.cn/blog_migrate/d7bf5d89026bf13d6b6c035300b90a62.jpeg)
二、具体的代码操作步骤
1、在开始时,先在Option Explicit语句下面定义一个窗体级常量,保存允许的最多登录的验证次数
Option Explicit
'登录最多输入3次
Const Maxlogtimes As Integer = 3
2 、“取消”按钮
这个按钮的代码功能是:产生对话框询问用户是否真的退出登录
Private Sub cmdCancel_Click()
'验证是否点了“是”进而执行退出
Dim intResult As Integer
intResult = MsgBox("你选择了退出登录,退出将不能启动管理系统!" & vbCrLf _
& "是否真的提出?", vbYesNo, "登录验证")
If intResult = vbYes Then End
End Sub
3、编写用户名和口令的验证过程
在编写代码之前,要先添加一个过程
Private Function Check_PassWord(ByVal UserName As String, ByVal Password As String) As Byte
On Error GoTo gpError '如果不对的话,进行最后的gpError
Dim objCn As New Connection, objRs As New Recordset, strCn As String
Dim strSQL As String
'建立数据库链接
objCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Data Source=" & App.Path & "\实例1.mdb"
objCn.Open
'执行查询命令,获得用户登录口令 '建立连接 打开
strSQL = "SELECT 口令 FROM 系统用户 WHERE 用户名='" & UserName & "'"
Set objRs.ActiveConnection = objCn 'Rs 与Cn的链接
objRs.Open (strSQL) '打开Rs
'判断有无查询结果
If objRs.EOF Then
Check_PassWord = 0 '没有查询结果,表示该用户为非法用户
Else
'检查口令是否正确
If Password <> Trim(objRs.Fields("口令").Value) Then
Check_PassWord = 1 '口令不正确
Else
Check_PassWord = 2 '口令正确
End If
End If
'关闭数据库连接,释放对象
objCn.Close
Set objRs = Nothing
Set objCn = Nothing
Exit Function
gpError:
Check_PassWord = 255 '验证无法正常完成,返回错误代码
Set objRs = Nothing
Set objCn = Nothing
End Function
4、“确定”按钮
此按钮的功能是: 1、判断输入用户名的次数是否超过3次 (定义一个静态变量记录)
2、输入的用户名和密码是否正确 并作出提示
3、调出数据库
Private Sub cmdOk_Click()
Static intLogtimes As Integer '用于保存用户请求验证的次数
Dim intCheck As Integer, strName As String, strPassword As String
intLogtimes = intLogtimes + 1 '计算登录次数
If intLogtimes > Maxlogtimes Then
MsgBox "你已超过允许验证次数!" & vbCr _
& "应用程序将结束!", vbCritical, "登录验证"
End '结束应用程序
Else '继续验证口令和用户名的合法性,并执行操作
strName = Trim(txtUserName.Text)
strPassword = Trim(txtpassWord.Text)
Select Case Check_PassWord(strName, strPassword)
Case 0
MsgBox "<" & strName & _
">不是系统用户,请检查用户名是否输入正确!", vbCritical, "登录验证"
txtUserName.SetFocus
txtUserName.SelStart = 0
txtUserName.SelLength = Len(txtUserName)
Case 1
MsgBox "口令错误,请重新输入!", vbCritical, "登录验证"
txtpassWord = ""
txtpassWord.SetFocus
Case 2 '口令正确
Unload Me
MsgBox "登录成功,将启动系统程序!", vbInformation, "登录验证"
'通常再次放置显示系统主窗体的语句如:frmmain.show
Case Else
MsgBox "登录未能正常完成!请重新登录程序," & vbCrLf _
& "如果仍未登陆,请报告系统管理员!", vbCritical, "登录验证"
End Select
End If
End Sub
惊喜
1.Option Explicit
之前一直都不太明白是什么意思?囫囵吞枣吞得有点儿彻底,所以今天又再次的理解了一下
option explicit 强制显示声明中的所有变量,该语句必须写在模块的所有过程之前。写这个语句之后,必须使用 Dim、Private、Public、ReDim 或 Static 语句来显式声明所有的变量,如果使用了未声明的变量名在编译时会出现错误。如果没有使用 Option Explicit 语句,除非使用Deftype语句指定了缺省类型,否则所有未声明的变量都是 Variant 类型的。
注意:使用 Option Explicit 可以避免键入已有变量时拼错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱。
2.Const 函数
在这段代码里 对象就是 MaxLogTimes 转化成 常量 3
意思就是最大的登陆次数为三次,超过三次,则程序就会终止
Const 常数定义,和dim类 似,但是const不能修改常数的值,dim定义的可以重新赋值
3.路径问题
敲完代码,一运行就出现了这么个框儿,看上去其实似曾相识,但找了半天我也没有看到登录系统的文件夹到底是从哪里来的,始终显示路径无效,我看了又看,app.path 相对路径,我又看看它显示的 “实例1.mdb”原来是我建的数据库的位置,一开始就没弄清楚,所以我都没把它和工程放到一个文件夹下,那它怎么能找得到呢?哈哈,长记性了。
4.单引号
看到于富的博客,我也去查了查,虽然不是很懂,但也看了看网上的说法,如下:
它和工程放到一个文件 由于没有看清楚红皮书里的标点符号,错把口令括号好的句点,看成了逗号,真的是,发现的时候,我也觉得很无奈,只能是长记性了。
6. SELECT * FROM * WHERE * 语句有两种格式:
SELECT * FROM * WHERE * = '……'
SELECT * FROM * WHERE * = '"……" '"
7.trim()函数
trim()函数是删除字符串中多余空格。例:密码为:123,输入:space123space,依然登陆成功。
Trim()是去掉开头和结尾的空格
ltrim()是去除字符串左边的空格
这个知识点一开始没有注意到,但试了一下,发现了,原来如果密码的前面或者后面有空格的话,也是可以运行成功的。但是密码“123”中间不能夹杂空格,那样是运行不成的。有点儿有意思呀。
8.On Error GoTo gpError '如果遇到错误跳转到goto后面的语句
此语句的功能是激活错误捕获,并将错误处理程序指定为从“行号”位置开始的程序段。
这是一个典型的错误处理过程。首先,我们可以预料到在此过程中有可能出现运行时错误,因此,在过程开始时,我们使用OnError GoTo gperror激活错误捕获功能,并指定从行号“gperror”开始的程序段为错误处理程序(注意,行号后面要加一个冒号,但在语句OnError GoTo gperror中不加冒号)。
当程序运行到语句某段代码并发生错误时,将执行行号“error”后面的语句。如果不发生错误,当执行到语句“ExitSub”时,将退出过程。在过程退出时,错误捕获功能就自动被取消了。
9.vbCr
![红皮书实例1+实例2总结 红皮书实例1+实例2总结](https://i-blog.csdnimg.cn/blog_migrate/90bfdfc112573631cca314996acf4558.jpeg)
![红皮书实例1+实例2总结 红皮书实例1+实例2总结](https://i-blog.csdnimg.cn/blog_migrate/35f403877987a0e5495da2ac63a40844.jpeg)
11.创建数据库
这是军星给我找出的问题,也是最最让我无地自容的一个问题,因为我始终没有找到除了上面的问题以外,代码还有哪里有问题,我就去求助了军星,他帮我看了很久,我们也把正确的代码放到我的工程里,结果就是运行不了,经过调试,发现是数据库的问题,后来,军星在我上厕所的时候,可能是灵光一闪,他说,隐约觉得我哪个地方的名称打错了,这才去数据库看了一下,发现我把“系统用户”写成了,“系统名称”,诶,你说说,军星也是哭笑不得呀,很开心,找到了问题所在,但确实花费了不少时间,特此要感谢军星小同学,不辞辛劳,努力帮我找错误,谢谢军星啦!
实例1的故事告一段落,收获很多,最大的收获就是——细心,一定要细心,深刻体会到了“细节决定成败”的内涵了。期待下面的学习。
实例2
实例2也是个磨人的小妖精呀,起初我是没有注意到的,但师父 给验项目的时候提出来了,我才意识到。实例2在运行的时候,可以在用户名处更改,这样相当于数据库也被更改了,师父让我自己研究一下如何能让数据库不在运行时被更改。我找了很久,也没查找,有点儿扎心。军星看我有点儿焦头烂额,过来看看我干嘛呢,发现了这个问题,一下就说出了 lock属性的修改,真是厉害呀,其实也是,如果可以修改,就是没被锁定,但我就是想不到,看来功底还是太薄了,要继续加油。