前言:
進入個人機房重構有一段時間了,這次的機房收費系統加入了七層,應用vb.net語言等等,學習了新的東西,這篇文章主要講vb.net在機房這個系統的小知識。本篇主要介紹四個知識點:
核心:
(一)、傳參與傳實體
在機房重構開始的時候,一直是傳實體,但是實體和值所占的空間可是差的很多。
:什麼是傳實體呢?在機房個人重構的時候,我們定義了一個實體層,在裡面,我們寫好了屬性和方法:
我們需要更新的是卡表,充值表,學生表,這樣就需要我們傳實體比較好。
UI層
Dim Fifregister As New Facade.FRegister
Dim card As New Entity.ECard
Dim student As New Entity.EStudent
Dim recharge As New Entity.ERecharge
'卡表
card.CardNo = txtCardId.Text.Trim()
card.Nvr_Cash = txtCash.Text.Trim()
card.Type = cmbType.Text.Trim()
card.Riqi = Date.Now.ToString("yyyy - MM - dd")
card.Time = DateTime.Now.ToString("HH:mm:ss")
card.CheckStatus = True
card.UserStatus = True
'card.UserID =
'學生表
student.StudenID = txtStudentId.Text.Trim()
student.StudentName = txtName.Text.Trim()
student.Sex = cmbSex.Text.Trim()
student.Department = txtDepartment.Text.Trim()
student.Major = txtMajor.Text.Trim()
student.Grade = cmbGrade.Text.Trim()
student.classes = cmbClass.Text.Trim()
student.Explain = txtExplain.Text.Trim()
'充值表
recharge.CardNo = txtCardId.Text.Trim()
recharge.CheckStatus = False
recharge.Recharge = txtCash.Text.Trim()
recharge.RechargeDate = Date.Now.ToString("yyyy - MM - dd")
recharge.RechargeTime = DateTime.Now.ToString("HH:mm:ss")
Dim flag2 As String
flag2 = Fifregister.Ifregister(card)
If flag2 = True Then
Dim flag1 As String
flag1 = Fifregister.FAdd(card, student, recharge)
End If
B層 :這個是B層的一個方法,注意下面的Byval傳的實體
Public Class BRegister
Public Function Ifuse(ByVal cardno As Entity.ECard) As String
Dim Iregister As IDAL.IRegister
Iregister = Factory.DataAccess.RegisterCardInfo
Dim myTable As New DataTable
myTable = Iregister.ifregister(cardno)
If myTable.Rows.Count = 0 Then
MsgBox("注冊成功!")
Else
MsgBox("該卡号已經注冊過,請重新注冊!!")
End If
Return True
End Function
外觀層、D層、接口層都是實體。
這是D層的一個方法,在指派的時候,直接用實體.方法
Public Function ifregister(cardno As Entity.ECard) As DataTable Implements IDAL.IRegister.ifregister
Dim Sql As String
Dim table As New DataTable '中間變量用于存儲從資料庫中 查找資訊
'聲明并執行個體化參數數組
Dim sqlParams As SqlParameter() = {New SqlParameter("@Chr_CardNo", cardno.CardNo),
New SqlParameter("@Chr_UserStatus", cardno.UserStatus)}
'調用SQL語句查詢
Sql = "select * from T_Card where Chr_CardID = @Chr_CardNo and Bit_UserStatus = @Chr_UserStatus"
'調用SqlHlper類中的ExecSelect()方法來執行查詢,并擷取傳回值
Dim mylist As New List(Of Entity.ECard)
table = helper.ExecSelect(Sql, CommandType.Text, sqlParams)
Return table
End Function
傳參數:(管理使用者為例)—判斷使用者級别
Private Sub cmbUserLevel_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbUserLevel.SelectedIndexChanged
'根據使用者級别加載資訊
Dim userlevel As String
userlevel = cmbUserLevel.Text.Trim
Dim fac As New Facade.FManageUser
Dim mylist As List(Of Entity.ELogin)
mylist = fac.Show(userlevel)
If mylist.Count = 0 Then
MsgBox("沒有該使用者級别資訊,請查詢其他資訊")
Else
dgvUserInfo.DataSource = mylist
End If
注意:userlevel定義的是字元串
同樣的外觀層、B層、D層傳遞的也是參數,
下面外觀代碼:
Public Function Show(ByVal level As String) As List(Of Entity.ELogin)
Dim bshow As New BLL.BManageUser
Dim flag As List(Of Entity.ELogin)
flag = bshow.Show(level)
Return flag
那麼,在D層會如何運用呢?
在指派的時候直接寫這個參數就行了!
Public Function Show(level As String) As List(Of Entity.ELogin) Implements IDAL.IManagerUser.Show
Dim sql As String
Dim sqlparams As SqlParameter() = {New SqlParameter("@Chr_Level", level)}
Dim table As New DataTable
sql = "select * from T_User where Chr_Level=@Chr_Level "
table = helper.ExecSelect(sql, CommandType.Text, sqlparams)
Dim mylist As List(Of Entity.ELogin)
mylist = Convert.convertToList(Of Entity.ELogin)(table)
Return mylist
在重構的時候,自己對這個并不是很了解,是以總結出來,僅供參考,希望對你有幫助!
(二)、byval與Byref
在開始敲機房的時候,并沒有多想,一直都用的是byval,自己也不清楚,之後通過查資料才發現:原來我們之前接觸過:
我們先來回顧一下傳值和傳位址
傳值:我們傳遞給函數是一個單純的數值過去)按值傳遞參數時,傳遞的隻是變量的 副本。如果過程改變了這個值,則所作變動隻影響副本而不會影響變量本身
傳位址:按位址傳遞參數時,過程用變量的記憶體位址去通路實際變量的内容。
為什麼要回顧這個呢?今天我們講到的Byval和Byref就和這個有關
Byval:按值傳遞
Byref:按位址傳遞
下面這篇文章介紹的很詳細!
http://www.111cn.net/net/vb-net/58999.htm
(三)、sub與function
對于菜鳥的我,在開始個人重構的時候,一直用的是Function
sub:過程,不傳回數值
function:函數,有傳回數值
(四)、屬性、方法的建立
Private _CardNo As String
Public Property CardNo() As String
Get
Return _CardNo
End Get
Set(value As String)
_CardNo = value
End Set
End Property