Проблема понимания модификаторов доступа в VB.Net со списком (объекта) - PullRequest
0 голосов
/ 29 марта 2011

Я недавно обновил большую часть своего кода, чтобы он соответствовал надлежащей n-уровневой архитектуре и программированию ОО, следуя примерам из книги.

У меня начинаются проблемы, потому что я не до конца понимаю модификаторы доступа.

Если я запускаю следующий код, я получаю сообщение об ошибке в строке

Dim clientFamilyDataAccessLayer As New ClientFamilyDAO

в BLL в точке, где он создает экземпляр DAL. Полное сообщение об ошибке: «Инициализатор типа для« ClientFamilyDAO »вызвал исключение. ---> System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.»

Как использовать эти функции для создания списка объектов ClientFamily, с которыми я затем смогу работать?

На своем слое пользовательского интерфейса я создаю список объектов; 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 голосов
/ 30 марта 2011

Проблема не связана с модификаторами доступа, скорее она связана с сообщением об исключении, которое вы получаете.Следующая строка в конструкторе ClientFamilyDAO могла бы вызвать проблему:

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

Вы уверены, что ClientFamilyManagementConnectionString существует в конфигурации?

...