簡體   English   中英

從數據庫中獲取動態按鈕花費的時間太長

[英]Fetching Dynamic buttons from database takes too long

我正在開發POS Windows應用程序,並且希望它運行的很快,但是當我從MySql中獲取數據時,要花5秒的時間來獲取一家餐廳的100張桌子。 在座的任何人都可以告訴我是否有一種方法可以在應用程序啟動時從數據庫中加載數據,這樣我以后就可以調用它們,而不必每次打開表表單時都等待它?

這是一個代碼示例:

FlowLayoutPanel flp = new FlowLayoutPanel();
            conn.Open();
            DataTable dt = new DataTable();
            DataSet ds = new DataSet();
            MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM tables ORDER BY number_of_table", conn);
            adapter.Fill(dt);
            ds.Tables.Add(dt);
            foreach (DataRow dr in dt.Rows)
            {
                Button b = new Button();
                b.BackColor = Color.FromArgb(241, 234, 182);
                b.FlatStyle = FlatStyle.Flat;
                b.Size = new Size(100, 100);
                b.Text = dr[1].ToString();
                b.Tag = dr[2].ToString();
                b.Click += new EventHandler(OpenTavolina);
                flowLayoutPanel1.Controls.Add(b);
            }
            conn.Close();

您確定這是需要5秒鍾的sql查詢嗎? 如果是這樣,則說明您的數據庫存在嚴重問題,您需要清理聯接並添加索引,或者可能是互聯網連接不良。 我懷疑從開始到繪制完成的整個過程為5秒。 如果可以將數據請求和按鈕繪制分為兩個不同的功能,則可以對它們進行計時。

最有可能的是,它正在執行100重排,重繪。

如果瓶頸是用戶界面,請嘗試在添加按鈕之前將流更新面板設置為visible = false,然后再將其設置回visible = true。

-在發現問題與重排后編輯1:

您可以為緩存創建一個靜態類。

例如...

public static class DataManager
{   
   public static List<Button> FormButtons {get; set;}

   static DataManager()
   {
      FormButtons = new List<Button>();
   }

   public static void LoadButtonsOnce()
   {
          //build buttons from database and perform a...

          FormButtons.Add(newButton) 
   }

}

現在您可以在任意位置訪問DataManager.FormButtons ...

請記住,這仍然無法解決重繪/重排的問題。 您仍然需要執行.visible hack來解決此問題。

數據庫加載100條只有三列的記錄的性能問題不太可能出現。

相反,問題將是將子控件添加到布局面板的100個單獨的調用。 每次添加新的子代時,它將執行布局處理周期。

為了解決這個問題,您可以指示控件暫停布局處理,直到完成添加子控件為止。 所以在您的foreach循環之前...

floatLayoutPanel1.SuspendLayout();

...然后在foreach循環之后再次允許布局處理...

floatLayoutPanel1.ResumeLayout();

然后,您只進行布局處理的一次。 如果您在生成的代碼中查找具有布局控件的任何Form,您將看到它在代碼的開頭和結尾自動生成這些調用。

您的第一個問題是查詢本身。 您正在執行select * from ...決不要執行select * ,而是僅返回所需的特定列來優化查詢。 例如,如果dr [1]是一個名為'name_of_table'的字段,而dr [2]是一個名為'number_of_table'的字段,則您的查詢應僅是, select name_of_table, number_of_table ...

附帶說明一下,切勿訪問c#代碼中的字段,例如dr[1] 這使得其他開發人員很難介入並處理您的代碼。 同樣,如果另一個開發人員更改了查詢,則該列所在的索引也會更改。 始終使用列名,例如dr["name_of_table"] 這樣,無論字段在“選擇”中位於何處,它都不會失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM