【发布时间】: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 公开了诸如Add、Clear、Remove等您可能不想向消费者公开的方法,而 IEnumerable 旨在让消费者仅枚举/读取结果。
标签: database vb.net winforms tableadapter strongly-typed-dataset