小变量,大智慧

遇到一个小问题,在这里写一下,积累一下小知识点,顺便写一下自己的体会。
个人重构,敲了登入,我就开始敲修改密码了。在修改密码中需要验证登入用户在这个窗体中输入的密码是否正确。如果正确,才可以进行更改密码,否则不可以。而这样就用到了,登入窗体的用户信息。
在这里,我当时想到的是直接利用登入窗体返回的查询实体,直接进行验证输入的旧密码是否正确。当时还想到了,第二种方式,就是将登入窗体的参数传到修改密码窗体中在此利用登入窗体当时的B和D层进行查询,然后返回结果。现在主要来讲解第二种方式。


第二种方式又有两种代码
第一版:
由于登入窗体一开始传递的是实体,所以我就想把这个实体传到修改密码窗体中,而如何实现这种实体的公用,这就是下面要讨论的。我们在VB版的机房收费系统中用到了,模块来放置公用的信息。同样VB.net也是用模块来放置公用信息的。
下面来看一下这版的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">Module UserMoudel 
 Public userTemp As New Model.UsersEntity
End Module
</span>


登入窗体的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">Dim uBll As New jifang.BLL.UserBLL
 Dim users As Model.UsersEntity '接收实体,用于BLL层的方法UserLogin()返回的数据类型,如果没有New就不是实例化 

Dim mUser As New Model.UsersEntity '
mUser.UserName = Trim(txtUserName.Text)
 mUser.PassWord = Trim(txtPassWord.Text) 
 userTemp = mUser 
 MsgBox(userTemp.UserName) '验证实体参数是否传入到模块中userTemp实体中了。

Try
  users = uBll.SelectUser(mUser)
  If (users.UserName Is nothing And users.PassWord Is nothing) Then
    lblBox.Text = "用户名或密码输入错误。"
  Else
    lblBox.Text = "登入成功!登入用户是:" + users.UserName
     frmChangePassword.Show()
   End If
Catch ex As Exception
	MsgBox(ex.Message())
End try
</span>

这样修改密码中就可以直接调用模块中的userTemp实体了。

Try

       users = uBll.SelectUsers(userNameTemp) '调用模块中的公用参数。

        If users.PassWord = txtOldPW.Text Then

             flage = uBll.ChangePW(user)

             If flage = True Then

             lblPoint.Text = "密码修改成功"

             End If

         Else

             lblPoint.Text = "旧密码输入错误"

             txtOldPW.Text = ""

             Exit Sub

        End If

  Catch ex As Exception

       MsgBox(ex.Message())

  End Try


但是我在测试修改密码的窗体的时候突然发现,第一次修改密码可以很正确的进行,但是如果接连两次进行修改密码,就会出现错误。具体什么错误忘记了。在这里为什么第二次进行修改密码的时候会出现错误那??
意味我们上面的模块中的实体传递的是两个参数。是登入窗体的用户名和密码。所以我们在修改密码查询的结果就为空。这时就会报错。于是就出现了第二版的代码
模块:这次只传入了用户名

<span style="font-family:KaiTi_GB2312;font-size:18px;">Module UserMoudel 
	Public userNameTemp As String
End Module</span>


登入窗体:

<span style="font-family:KaiTi_GB2312;font-size:18px;">Private Sub btnOK_Click(sender As Object,e As EventArgs) Handles btnOK.Click
	Dim uBll As New jifang.BLL.UserBLL
	Dim users As Model.UsersEntity '接收实体,用于BLL层的方法UserLogin()返回的数据类型,如果没有New就不是实例化 

userNameTemp = Trim(txtUserName.Text) '公共参数
MsgBox(userNameTemp) '验证参数是否传入到模块中userNameTemp实体中了。

Try
	users = uBll.SelectUsers(userNameTemp)
	If users.PassWord = txtPassWord.Text Then
	   lblBox.Text = "登入成功!登入用户是:" + users.UserName
	  frmChangePassword.Show()
	  Me.Hide()
     Else
	  lblBox.Text = "用户名或密码输入错误。"
     End If</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">Catch ex As Exception
     MsgBox(ex.Message())
End Try
End Sub</span>


在登入窗体中进行调用

<span style="font-family:KaiTi_GB2312;font-size:18px;">Try
	users = uBll.SelectUsers(userNameTemp)
	If users.PassWord = txtOldPW.Text Then
	  flage = uBll.ChangePW(user)
	  If flage = True Then
	     lblPoint.Text = "密码修改成功"
         End If
     Else
	lblPoint.Text = "旧密码输入错误"
       txtOldPW.Text = ""
	 Exit Sub
     End If
Catch ex As Exception
    MsgBox(ex.Message())
End Try</span>


从这个过程中,我明白了两点:

①公共模块中的参数,尽量独立,不要把他们绑到一块,不然有时候,在调用的时候,表面看着没有问题,但实际上会有潜在的危险。
②完美的代码不是一次就可以敲出来的,它是一个循序渐进的过程。



相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...