【问题标题】:Winforms Data from database across multiple formsWinforms 跨多个表单的数据库中的数据
【发布时间】:2019-03-06 18:41:05
【问题描述】:

我有一个带有 ms sql 服务器后端的 winforms 应用程序。在我的数据库中,我有类似状态的查找表,以及数据很少更改的其他表。在我的应用程序中,多个表单可能使用相同的查找表(其中一些包含大量数据)。不是每次打开表单时都加载/填充数据,有没有办法缓存数据库中的数据,可以从多个表单访问。我做了一些搜索,但找不到最佳解决方案。有缓存、字典等。什么是最好的解决方案,你能指出我讨论它的文档,甚至可能有一个例子。

编辑: 在我原来的帖子中,我没有提到我有一个强类型数据集并使用 tableadapter。我想在我的应用程序启动时预加载我的查找表,然后让这些数据集表在整个应用程序中用于多个表单,而不必在每个表单上填写它们。

我尝试过创建一个类:

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 

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

编辑2: 我也尝试过每个 cmets,但不确定我做对了。如果我做得正确,那么我如何在设计时将其用作数据源,我只能以编程方式进行吗?

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

【问题讨论】:

  • 尽可能简单,您可以创建一个单独的项目,其中有一个静态类,其中包含一些表示缓存数据的属性。当您使用该属性时,您会检查底层属性静态字段是否已被初始化。如果不初始化(从数据库加载数据),如果是,则返回静态字段。
  • 我想我正在寻找的是如何做一个全局数据集。
  • how do I use that as a datasource at design time 你的意思是专门作为一个winforms控制数据源吗?
  • 结合下面的答案,我想你已经有了。添加您的控件,单击属性箭头,选择数据源,添加项目数据源,对象,下一步,将包含模块的项目展开到属性“技能”,选中“技能”,完成。您将看到设计器在底部生成了SkillBindingSource。并且您的控件应该填充类 skill 的属性。
  • 我要补充一点,包含数据的模块的公共属性应该是IEnumerable(Of Skill) 类型,而不是List(Of Skill)。不同之处在于 List 公开了诸如 AddClearRemove 等您可能不想向消费者公开的方法,而 IEnumerable 旨在让消费者仅枚举/读取结果。

标签: database vb.net winforms tableadapter strongly-typed-dataset


【解决方案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

【讨论】:

  • 但是如果数据库表有多个键字段和值字段怎么办。它可以由 2+ 列组成
  • 可以为 LookupValue 类添加任意数量的属性,也可以为不同的记录结构创建多个类。
  • 不要返回List(Of LookupValue),而是创建一个封装所有数据库状态的类并返回它。这类似于静态工厂方法。
  • 说我在整个应用程序中使用数据集和表格适配器。现在我像“Me.TSTAFFSKILLTableAdapter.Fill(Me.EML_StaffingDataSet.TSTAFFSKILL)”一样填写每个当我以这种方式加载数据时最好的选择是什么?
  • @djv,我已经用一些更新更新了我的问题。在我的原始帖子中应该更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多