database - 来自数据库的 Winforms 数据跨多种形式

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

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

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

我试过创建一个类:

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: 我也根据评论尝试过此操作,但不确定我是否正确执行。如果我做得正确,那么我如何在设计时将其用作数据源,我只能以编程方式进行吗?

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

想法是您有一个 LookupData 实例(VB 中的一个模块,只能有一个)。查找数据有一系列属性,每个属性都从数据库返回一个值列表。如果数据已经加载,它只返回缓存的内容。如果尚未加载数据,则在第一次引用它时会从数据库中检索它。

您可以在代码的其他地方使用它,如下所示:

Dim myStatuses = LookupData.Statuses

关于database - 来自数据库的 Winforms 数据跨多种形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55030097/

相关文章:

php - 这个 MySQL 查询有什么问题?

c# - 添加 Web 引用时拒绝访问路径

c# - ListView 中的自动宽度

sql - 使用大于运算符和 ORDER BY 的 MySQL 查询的索引帮助

database - 最小覆盖和功能依赖

asp.net - 将 session 变量传递给 SQLDataSource 时出错

.net - 我如何知道 .net 事件是否已被处理?

.net - 为什么字体选择器对话框中没有显示已安装的字体?

c# - 将多个列表绑定(bind)到 DataGridView

python - 带有注释的 Django 查询集