我有一个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
您可能想要考虑延迟加载模式,如下所示:
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