我有一个winforms应用程序,它有一个ms sql server后端。在我的数据库中,我有相似状态的查找表,以及数据很少更改的其他表。在我的应用程序中,有几个表单可能使用相同的查找表(有些表单包含大量数据)。与每次打开表单时加载/填充数据不同,是否有方法从数据库中缓存可从多个表单访问的数据。我做了一些调查,但找不到最好的解决办法。有缓存,字典等。什么是最好的解决方案,你能给我指一下文档,讨论它,甚至可能有一个例子。
编辑:
在我最初的文章中,我没有提到我有一个强类型的数据集并使用tableadapters。我希望在应用程序启动时预加载查找表,然后在整个应用程序中对多个表单使用这些数据集表,而不必在每个表单上填写它们。
我试过创建一个类:

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

当我的应用程序启动时,我在后台工作程序上运行这个。所以它加载数据集表。在fill中,我可以看到datatable中有数据。当我打开一个表单时,我想使用数据集表,但它似乎清除了数据。不确定我的方法是否正确或者我的错误在哪里。
编辑2:
我也尝试了每个评论,但不确定我做得是否正确。如果我做得正确,那么在设计时如何将其用作数据源,我只能以编程方式这样做吗?
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

最佳答案

您可能需要考虑一种延迟加载模式,如下所示:

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

其思想是,您有一个lookupdatea实例(vb中的一个模块,只能有一个)。查找数据有一系列属性,每个属性都返回数据库中的值列表。如果数据已经加载,它只返回它缓存的内容。如果数据尚未加载,则在第一次引用时,它将从数据库中检索该数据。
您可以在代码的其他地方使用它,如下所示:
Dim myStatuses = LookupData.Statuses

10-08 07:21
查看更多