C#将所有数据(从Access数据库)复制到列表和字典

时间:2017-07-26 18:25:27

标签: c# ms-access optimization query-optimization

项目说明

我正在创建两个窗体应用程序,其中一个窗体可以插入,搜索和导出(放入word doc)数据,另一个窗体将更新和删除数据。这些数据来自具有10个表的Access数据库:

  • STAKEHOLDERS_ST
  • STAKEHOLDERS_STAFF_SST
  • STAKEHOLDERS_RELATED_DOCUMENT_STRD
  • RECENT_INTERACTIONS_RI
  • RECENT_INTERACTIONS_PARTICIPANTS_RIP
  • RECENT_INTERACTION_MATERIALS_PREPARED_RIMP
  • ODI_STAFF_OS(尚未使用)
  • MEETINGS_MET
  • MEETINGS_NOTES_MN
  • BRIDGE_ST_MET

这些表格如下: enter image description here

为了从DB访问数据,我决定创建字典和列表,并将所有数据复制到这些集合中。这样,程序将以合理的速度轻松地在GUI中显示数据。此外,每当用户想要显示利益相关者的某些信息时,程序将使用lamba表达式和Linq来显示数据。起初,我的第一次尝试是使用SQL查询直接从DB获取信息,但我注意到这个过程非常慢。

我的问题

通常,应用程序中的所有主要功能(在GUI中显示数据以及在DB中插入,更新,删除数据)都可以正常工作。但是,我唯一关心的是将数据加载到集合中并显示表单的时间。更具体地说,每当用户午餐表格时,他们的form_load事件将在其中填充9个集合:3个字典和6个列表。但是,我注意到加载这些数据和显示GUI需要一些时间(每个表中10条记录约6秒)。

以下是我的代码示例:

//Collection data
Dictionary<int, ST_Stakeholder> List_ST;
List<SST_StakeholderStaff> List_SST;
List<STRD_Stakeholder_Related_Document> List_STRD;
Dictionary<int, RI_Recent_Interaction> List_RI;
List<RIP_Recent_Interaction_Participants> List_RIP;
List<RIMP_Recent_Interaction_Materials_Prepared> List_RIMP;
Dictionary<int, MET_Meeting> List_MET;
List<MN_Meeting_notes> List_MN;
List<Tuple<int, int>> List_BR;


private void EditSTInfo_Load(object sender, EventArgs e)
{
    try
    {
        //Fill the Collection
        List_ST = new Dictionary<int, ST_Stakeholder>(DatabaseConnection.DicStakeholderInformation());
        List_SST = new List<SST_StakeholderStaff>(DatabaseConnection.ListStakeholderStaff());
        List_STRD = new List<STRD_Stakeholder_Related_Document>(DatabaseConnection.ListStakeholderDocument());
        List_RI = new Dictionary<int, RI_Recent_Interaction>(DatabaseConnection.DicRecentInteraction());
        List_RIP = new List<RIP_Recent_Interaction_Participants>(DatabaseConnection.ListRecentInteractionParticipants());
        List_RIMP = new List<RIMP_Recent_Interaction_Materials_Prepared>(DatabaseConnection.ListRecentInteractionMaterials());
        List_MET = new Dictionary<int, MET_Meeting>(DatabaseConnection.DicMeeting());
        List_MN = new List<MN_Meeting_notes>(DatabaseConnection.ListMeetingNotes());
        List_BR = new List<Tuple<int, int>>(DatabaseConnection.DicBrige());

        //Display the Stakeholder Name in the List Bos
        foreach (KeyValuePair<int, ST_Stakeholder> item in List_ST)
        {
            lbListStakeholder.Items.Add(item.Value.ST_Name);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        DatabaseConnection.CloseDB();
    }
}

PS:DataBaseConnection是静态类,其中函数必须执行SQL命令。这里是DatabaseConnection.DicStakeholderInformation()

的示例
//Display the data
//Function that return a dictionnary of Stakeholder information
public static Dictionary<int, ST_Stakeholder> DicStakeholderInformation()
{
    Dictionary<int, ST_Stakeholder> result = new Dictionary<int, ST_Stakeholder>();
    _CncxBD.Open();
    OleDbCommand cmd = new OleDbCommand(stListStakeholderinfo, _CncxBD);
    OleDbDataReader row = cmd.ExecuteReader();

    while (row.Read())
    {
        result.Add((int)row["ST_ID"], new ST_Stakeholder((string)row["ST_Name"], (string)row["ST_Address"], (string)row["ST_City"], (string)row["ST_Province"], (string)row["ST_Postal_Code"], (string)row["ST_Vision"], (string)row["ST_Objectives"], (string)row["ST_Major_Successes"], (string)row["ST_Gorvernance"], (string)row["ST_Funding_Structure"], (string)row["ST_Type_of_work"], (string)row["ST_Scope"], row["ST_Additional_Information"].ToString()));
    }

    _CncxBD.Close();

    return result;

}

有了这个,我只是想知道是否有人可以帮助我优化所有这些工作的速度!我的第一个想法可能是创建多个Thread以填充集合。但我认为你不能将线程用于收集,因为它不安全。无论如何,我只是需要一些想法来加快这个过程。

1 个答案:

答案 0 :(得分:1)

可能你可以创建不同的任务并在不同的线程中运行它。

 Task.Factory.StartNew( () => { your code here});

稍后,如果您的下一步取决于要加载的数据,您可以将您创建的所有任务添加到列表中。

List<Task> lst = new List<Task>();

然后让你的应用程序等待所有这些任务完成继续。

  Task.WaitAll(tasks.ToArray()); 

想象一下,您已经创建了4个不同的任务,您已经按照所需的时间对您的程序进行分组,并且您创建了4个任务,每个任务将在不同的线程中运行,并且它们将并行运行。

我希望这对你有所帮助,可能还有更好的方法。我有时会这样做,以加快繁重的处理。

如果你的下一个代码不依赖于这个字典被填充继续只是不等待任务并继续,他们将继续在后台工作。

谢谢