1. 程式人生 > >C#中優化資料查詢速度

C#中優化資料查詢速度

方案一:採用DataSet作為資料來源:

  • 思路1:將List轉換為DataSet,然後用DataSet作為資料來源。

轉換函式如下:

publicstatic DataSet ToDataSet(IList p_List)

        {

            DataSet result = new DataSet();

            DataTable _DataTable = newDataTable();

            if (p_List.Count > 0)

            {

                PropertyInfo[] propertys =p_List[0].GetType().GetProperties();

                foreach (PropertyInfo pi inpropertys)

                {

                   //_DataTable.Columns.Add(pi.Name, pi.PropertyType);

                   _DataTable.Columns.Add(pi.Name);

                }

                for (int i = 0; i <p_List.Count; i++)

                {

                    ArrayList tempList = newArrayList();

                    foreach (PropertyInfo pi inpropertys)

                    {

                        object obj =pi.GetValue(p_List[i], null);

                        tempList.Add(obj);

                    }

                    object[] array =tempList.ToArray();

                   _DataTable.LoadDataRow(array, true);

                }

            }

            result.Tables.Add(_DataTable);

            return result;

        }

資料繫結部分程式碼如下:

privatevoid RefreshData()

        {

            try

            {

                FormFactory.ShowWaitForm(this);

               List<VisitorRegisterModel> list =VisitorRegisterBll.GetListDuringTime(dateEditStartTime.DateTime,dateEditEndTime.DateTime);

               //this.gridControlVisitorRecord.DataSource = list;

                DataSet ds = ToDataSet(list);

               this.gridControlVisitorRecord.DataSource = ds;

               this.gridViewVisitorRecord.BestFitColumns();

                FormFactory.CloseWaitForm();

               //判斷是否有資料

                if (list.Count <= 0)

                {

                   FormFactory.ShowMessageBoxWarningDialog(this, "無資料!");

                    return;

                }

            }

            catch (Exception ex)

            {

               FormFactory.ShowMessageBoxErrorDialog(this, "載入資料失敗!");

               GlobalData.Instance.Log.Error(string.Format("載入資料失敗!{0}", ex.Message));

            }

        }

存在的問題:

如果直接將DataSet繫結到GridControl中雖然速度會加快但是會出現有個小+號的現象。如果直接用DataSet.Tables[0]作為資料來源,則繫結速度又會慢下來。

  • 思路二:直接重新建立資料庫連線,從資料庫直接取資料放入DataSet作為資料來源。

privatevoid RefreshData()

        {

            try

            {

                FormFactory.ShowWaitForm(this);

               //List<VisitorRegisterModel> list =VisitorRegisterBll.GetListDuringTime(dateEditStartTime.DateTime,dateEditEndTime.DateTime);

               //this.gridControlVisitorRecord.DataSource = list;

                string con ="server=127.0.0.1;database=YKTTest;uid=sa;pwd=sa";

                stringcommandText = "selectPID,NAME,SEX,COMPANY,IDTYPE,IDNO,LINKWAY,REGTIME,RECEIVERNAME,RECEIVERDEPARTMENT,ACCOMPANYNUMBER,REASON,BELONGINGS,CARTAG,CARNO,PASSTYPE,CARDNO,CARDSN,VALIDITYTIME,LEAVETIME,RETURNCARDTAGFROM FK_VISITORREGISTER " + string.Format(" where REGTIME >='{0}'and REGTIME<= '{1}'", dateEditStartTime.Text, dateEditEndTime.Text);

                SqlDataAdapteroda = new SqlDataAdapter(commandText, con);

               dataSetVisitor.Clear();

                oda.Fill(dataSetVisitor);           //dataSetVisitor是介面上的一個DataSet控制元件

                oda.Dispose();

               this.gridViewVisitorRecord.BestFitColumns();

                FormFactory.CloseWaitForm();

               //判斷是否有資料

                //if (list.Count <= 0)

                //{

                //   FormFactory.ShowMessageBoxWarningDialog(this, "無資料!");

                //    return;

                //}

            }

            catch (Exception ex)

            {

               FormFactory.ShowMessageBoxErrorDialog(this, "載入資料失敗!");

               GlobalData.Instance.Log.Error(string.Format("載入資料失敗!{0}", ex.Message));

            }

        }

存在的問題:

直接重新連線資料庫進行資料的提取從而通過DataSet繫結到GridControl控制元件,可以大大提高繫結速度,用List需要80S的繫結用此種方法只用3S即可。但是也是存在同樣的問題,不僅會出現+,而且之前通過Model中做的處理(比如離開標記的顯示、卡號或者訪客單號的處理)也都相當於失效了。

方案二:在繫結GridControl資料來源時採用ServerMode,但是這種方式需要一個特定格式的檔案,相當於有點小顛覆現在所用的三層架構,目前沒有深入實驗,網上說此種繫結速度比較快,但是沒有切實證實。

方案三:使用DEV中提供的LinqServerModeSource和XPServerCollectionSource作為資料來源,都要有相應格式檔案的支援,目前沒有深入測試。