I'm new to ASP.Net and up until now my code has worked but has been a mish mash all over the place with no real structure. I'm trying to teach myself how to keep the presentation/BLL/DAL separate so I have built a simple page to try and work with. Page has 3 text boxes: clock number, first name and last name. On inputting a clock number in the clock number text box, I want to go off to my database and fetch the first name and last name of the person that clock number belongs to.My DAL consists of 3 classes as below:Public Class EmployeeNamePrivate _FirstName As StringPrivate _Lastname As StringPublic Property FirstName() As String    Get        Return _FirstName    End Get    Set(value As String)        _FirstName = value    End SetEnd PropertyPublic Property LastName() As String    Get        Return _Lastname    End Get    Set(value As String)        _Lastname = value    End SetEnd PropertyEnd ClassPublic Class EmployeeNameDBAccessPublic Function GetEmployeeName(clockNo As Integer) As EmployeeName    Dim employeeName As EmployeeName = Nothing    Dim params As SqlParameter() = New SqlParameter() {New SqlParameter(@clockNo, clockNo)}    Using tbl As DataTable = SMARTDBHelper.ExecuteParameterisedSelectCommand(getEmployeeName, CommandType.StoredProcedure, params)        If tbl.Rows.Count = 1 Then            Dim row As DataRow = tbl.Rows(0)            employeeName = New EmployeeName            employeeName.FirstName = row(INITIALS).ToString()            employeeName.LastName = row(SURNAME).ToString()        End If    End Using    Return employeeNameEnd FunctionEnd ClassPublic Class SMARTDBHelperConst constr As String = connection string goes hereFriend Shared Function ExecuteParameterisedSelectCommand(cmdName As String, cmdType As CommandType, param As SqlParameter()) As DataTable    Dim tbl As New DataTable()    Using con As New SqlConnection(constr)        Using cmd As SqlCommand = con.CreateCommand()            cmd.CommandType = cmdType            cmd.CommandText = cmdName            cmd.Parameters.AddRange(param)            Try                If con.State <> ConnectionState.Open Then                    con.Open()                End If                Using da As New SqlDataAdapter(cmd)                    da.Fill(tbl)                End Using            Catch ex As Exception                Throw            End Try        End Using    End Using    Return tblEnd FunctionEnd ClassMy BLL consists of the following classPublic Class EmployeeNameHandlerPrivate employee As EmployeeNameDBAccessPublic Sub New()    employee = New EmployeeNameDBAccess()End SubPublic Function GetFirstname(clockNo As Integer) As String    Dim emp = employee.GetEmployeeName(clockNo)    Return emp.FirstNameEnd FunctionPublic Function GetLastname(clockNo As Integer) As String    Dim emp = employee.GetEmployeeName(clockNo)    Return emp.LastNameEnd FunctionEnd ClassThen on my page I have the following code to populate the text boxesProtected Sub txtCLock_TextChanged(sender As Object, e As EventArgs) Handles txtCLock.TextChanged    Dim emp As New EmployeeNameHandler    Dim cn As Integer = CInt(txtCLock.Text)    Dim firstname = emp.GetFirstname(cn)    Dim lastname = emp.GetLastname(cn)    txtFirstName.Text = firstname    txtLastName.Text = lastnameEnd SubI appreciate this is basic however I would be interested to gather opinion of if I am going down the correct route here? Could this be done in a better way? Also, there is next to no error handling here, this is a topic I'm very weak on so would appreciate any advice etc. Thanks
Separating presentation/BLL/DAL
asp.net;vb.net