Winforms来自多个表单的数据库中的数据

问题描述 投票:1回答:1

我有一个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 

我的应用程序启动时,我在后台工作程序上运行它。所以它加载数据集表。在填充时,我可以看到数据表中包含数据。当我打开表单时,我想使用数据集表,但它似乎清除了数据。不确定我的方法是否正确或我的错误在哪里。

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
database vb.net winforms tableadapter strongly-typed-dataset
1个回答
1
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.