Winforms Данные из базы данных в нескольких формах - PullRequest
1 голос
/ 06 марта 2019

У меня есть приложения winforms, которые имеют сервер SQL сервера SQL. В моей базе данных у меня есть таблицы поиска для одинакового статуса и другие таблицы, где данные редко изменяются. В моем приложении несколько форм могут использовать одни и те же таблицы поиска (некоторые содержат много данных). Вместо загрузки / заполнения данных каждый раз, когда форма открыта, есть способ кэшировать данные из базы данных, к которой можно получить доступ из нескольких форм. Я немного искал, но не смог найти лучшего решения. Есть кеширование, словари и т. Д. Какое лучшее решение, и можете ли вы указать мне документацию, в которой это обсуждается и может даже иметь пример.

Edit: В моем первоначальном посте я не упомянул, что у меня есть строго типизированный набор данных и я использую табличные адаптеры. Я хочу предварительно загрузить таблицы поиска при запуске приложения, а затем использовать эти таблицы наборов данных во всем приложении, в нескольких формах, не заполняя их в каждой форме.

Я попытался создать класс:

Public Class dsglobal

    Public Shared EML_StaffingDataSet As EML_StaffingDataSet

    Public Shared Sub populateDS()
        EML_StaffingDataSet = New EML_StaffingDataSet
    End Sub

    Public Shared Sub loadskills()
        Dim ta As New EML_StaffingDataSetTableAdapters.TSTAFFSKILLTableAdapter
        ta.Fill(EML_StaffingDataSet.TSTAFFSKILL)
    End Sub

End Class 

Я запускаю это в фоновом режиме, когда запускается мое приложение. Таким образом, он загружает таблицу наборов данных. При заполнении я вижу, что в данных есть данные. Когда я открываю форму, я хочу использовать таблицу набора данных, но она, кажется, очищает данные. Не уверен, что мой подход правильный или где моя ошибка.

Edit2: Я также пробовал это в комментариях, но не уверен, что делаю это правильно. Если я делаю это правильно, то как мне использовать это как источник данных во время разработки, могу ли я сделать это только программно?

Public Module lookupdata
    Private EML_StaffingDataSet As EML_StaffingDataSet

    Private skillvalues As List(Of skill)

    Public ReadOnly Property skill As List(Of skill)
        Get
            If skillvalues Is Nothing Then
                getskillvalues()
            End If
            Return skillvalues
        End Get
    End Property

    Private Sub getskillvalues()
        skillvalues = New List(Of skill)
        EML_StaffingDataSet = New EML_StaffingDataSet
        Dim ta As New EML_StaffingDataSetTableAdapters.TSTAFFSKILLTableAdapter
        ta.Fill(EML_StaffingDataSet.TSTAFFSKILL)

        For Each row As DataRow In EML_StaffingDataSet.TSTAFFSKILL
            Dim skill As New skill
            skill.skill_id = row("skill_id")
            skill.skill_desc = row("skill_desc")
            skill.skill_open_ind = row("skill_open_ind")
            skillvalues.Add(skill)
        Next
    End Sub

End Module

Public Class skill
    Public Property skill_id As Integer
    Public Property skill_desc As String
    Public Property skill_open_ind As Boolean
End Class

1 Ответ

1 голос
/ 06 марта 2019

Вы можете рассмотреть ленивый шаблон загрузки, например:

Public Module LookupData
    Private statusValues As List(Of LookupValue)

    Public Readonly Property Statuses As List(Of LookupValue)
        Get
            If statusValues Is Nothing Then
                GetStatusValues()
            End If

            Return statusValues
        End Get
    End Property

    Private Sub GetStatusValues()
        statusValues = New List(Of LookupValue)

        Dim sql = "select key, value from StatusTable"

        'TODO: Read the items from the database here, adding them to the list.

    End Sub

End Module

Public Class LookupValue
    Public Property Key As String
    Public Property Value As String
End Class

Идея состоит в том, что у вас есть один экземпляр LookupData (модуль в VB может быть только один). Данные для поиска имеют ряд свойств, каждое из которых возвращает список значений из базы данных. Если данные уже были загружены, они просто возвращают то, что кешировали. Если данные не были загружены, то при первом обращении к ним они извлекаются из базы данных.

Вы можете использовать его в другом месте своего кода следующим образом:

Dim myStatuses = LookupData.Statuses
...