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作為資料來源,都要有相應格式檔案的支援,目前沒有深入測試。