使用List(Of Object)了解VB.Net中的访问修饰符的问题

时间:2011-03-29 15:43:45

标签: vb.net shared access-modifiers generic-list

我最近更新了很多代码,以遵循正确的n层架构和OO编程,遵循书中的示例。

我现在开始遇到问题,因为我不完全了解访问修饰符。

如果我运行以下代码,我会在

行收到错误
Dim clientFamilyDataAccessLayer As New ClientFamilyDAO

在BLL中它创建了一个DAL实例。完整的错误消息是:"' ClientFamilyDAO'的类型初始值设定项。抛出一个例外。 ---> System.NullReferenceException:未将对象引用设置为对象的实例。"

如何使用这些函数创建我可以使用的ClientFamily对象列表?

在我的UI图层上,我创建一个对象列表; ClientFamilies

Dim listOfClientFamilies As List(Of ClientFamily) = ClientFamily.GetClientFamiliesByKRM(selectedEmployee.StaffNumber)

这是BLL中的功能

Public Shared Function GetClientFamiliesByKRM(ByVal krmStaffNumber As Integer) As List(Of ClientFamily)

        Dim clientFamilyDataAccessLayer As New ClientFamilyDAO
        Return clientFamilyDataAccessLayer.GetClientFamiliesByKRM(krmStaffNumber)

    End Function

这是DAL中的功能

Public Function GetClientFamiliesByKRM(ByVal staffNumber As Integer) As List(Of ClientFamily)

        Dim currentConnection As SqlConnection = New SqlConnection(_connectionString)

        Dim currentCommand As New SqlCommand
        currentCommand.CommandText = mainSelectStatement & " WHERE Key_Relationship_Manager = @StaffNumber ORDER BY Client_Family_Name"
        currentCommand.Parameters.AddWithValue("@StaffNumber", staffNumber)
        currentCommand.Connection = currentConnection

        Dim listOfClientFamilies As New List(Of ClientFamily)

        Using currentConnection

            currentConnection.Open()

            Dim currentDataReader As SqlDataReader = currentCommand.ExecuteReader()

            Do While currentDataReader.Read

                Dim newClientFamily As AECOM.ClientFamily = PopulateClientFamily(currentDataReader)

                listOfClientFamilies.Add(newClientFamily)

            Loop

        End Using

        Return listOfClientFamilies

    End Function

这是完整的ClientFamilyDAO类:

    Public Class ClientFamilyDAO

    Private Const mainSelectStatement As String = "SELECT Client_Family_ID, Client_Family_Name, Key_Relationship_Organisation, Key_Relationship_Manager, Obsolete, Market_Sector_ID FROM Client_Families"

    Private Shared ReadOnly _connectionString As String = String.Empty

    Shared Sub New()

        _connectionString = WebConfigurationManager.ConnectionStrings("ClientFamilyManagementConnectionString").ConnectionString

    End Sub

    Public Function GetClientFamiliesByKRM(ByVal staffNumber As Integer) As List(Of ClientFamily)

        Dim currentConnection As SqlConnection = New SqlConnection(_connectionString)

        Dim currentCommand As New SqlCommand
        currentCommand.CommandText = mainSelectStatement & " WHERE Key_Relationship_Manager = @StaffNumber ORDER BY Client_Family_Name"
        currentCommand.Parameters.AddWithValue("@StaffNumber", staffNumber)
        currentCommand.Connection = currentConnection

        Dim listOfClientFamilies As New List(Of ClientFamily)

        Using currentConnection

            currentConnection.Open()

            Dim currentDataReader As SqlDataReader = currentCommand.ExecuteReader()

            Do While currentDataReader.Read

                Dim newClientFamily As AECOM.ClientFamily = PopulateClientFamily(currentDataReader)

                listOfClientFamilies.Add(newClientFamily)

            Loop

        End Using

        Return listOfClientFamilies

    End Function

    Private Function PopulateClientFamily(ByVal currentDataReader As SqlDataReader) As AECOM.ClientFamily

        Dim newClientFamily As New AECOM.ClientFamily

        If Not (currentDataReader.IsDBNull(currentDataReader.GetOrdinal("Client_Family_ID"))) Then
            newClientFamily.ClientFamilyID = currentDataReader("Client_Family_ID")
        End If

        If Not (currentDataReader.IsDBNull(currentDataReader.GetOrdinal("Client_Family_Name"))) Then
            newClientFamily.ClientFamilyName = currentDataReader("Client_Family_Name")
        End If

        If Not (currentDataReader.IsDBNull(currentDataReader.GetOrdinal("Key_Relationship_Organisation"))) Then
            Select Case currentDataReader("Key_Relationship_Organisation")
                Case False
                    newClientFamily.IsKeyRelationshipOrganisation = False
                Case True
                    newClientFamily.IsKeyRelationshipOrganisation = True
            End Select
        End If

        If Not (currentDataReader.IsDBNull(currentDataReader.GetOrdinal("Key_Relationship_Manager"))) Then
            newClientFamily.KeyRelationshipManagerStaffNumber = currentDataReader("Key_Relationship_Manager")
        End If

        If Not (currentDataReader.IsDBNull(currentDataReader.GetOrdinal("Obsolete"))) Then
            Select Case currentDataReader("Obsolete")
                Case False
                    newClientFamily.Obsolete = False
                Case True
                    newClientFamily.Obsolete = True
            End Select
        End If

        If Not (currentDataReader.IsDBNull(currentDataReader.GetOrdinal("Market_Sector_ID"))) Then
            newClientFamily.MarketSectorID = currentDataReader("Market_Sector_ID")
        End If

        Return newClientFamily

    End Function

End Class

1 个答案:

答案 0 :(得分:0)

该问题与访问修饰符无关,而是与您获得的异常消息有关。 ClientFamilyDAO构造函数中的以下行似乎会导致问题:

_connectionString = WebConfigurationManager.ConnectionStrings("ClientFamilyManagementConnectionString").ConnectionString

您确定配置中存在ClientFamilyManagementConnectionString吗?