程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 通過延遲DataTable的Expression列計算來提高Fill的性能

通過延遲DataTable的Expression列計算來提高Fill的性能

編輯:關於.NET

在使用非強類型普通DataSet的時候,如果要向DataTable中含有Expression列的話,一般都采用下面 這樣的步驟來提高應用程序的性能。

1.首先使用DataAdapter.Fill方法填充一個DataTable。

2.然後在通過編碼向DataTable中添加Expression列。

3.將這個DataTable作為數據源綁定到相關的控件上(比如DataGridView)。

示例代碼:

1     dataAdapter.Fill(dt);
2     dt.Columns.Add("ItemTotal", typeof(Decimal), "Quantity * UnitPrice");
3     dataGridView.DataSource = dt;

當使用強類型類型化DataSet的時候,由於DataTable中的Expression列已經創建好了,就得另辟方法 來解決性能問題。方法的大體思路是這樣的:

1.在調用Fill方法之前, 遍歷DataTable的所有列,如果該列為Expression則以該列名稱作為Key, Expression表達式作為Value存入一個Hashtable中,然後將該列的Expression屬性設置為空。

2.調用DataAdapter(或者DataTableAdapter)的Fill方法來填充這個DataTable。

3.最後再遍歷DataTable的所有列,判斷Hashtable["列名"]是否存在, 如果存在,則將相應的Value 值賦給該列的Expression屬性,最後清空Hashtable。

示例代碼:

 1Hashtable expressionKey = new Hashtable();
 2
 3//規避DataTable的Expression列,減輕Fill時的負擔
 4for (int i = 0; i < targetTable.Columns.Count; i++)
 5{
 6    if (targetTable.Columns[i].Expression != string.Empty)
 7    {
 8        expressionKey.Add(targetTable.Columns[i].ColumnName, targetTable.Columns [i].Expression);
 9        targetTable.Columns[i].Expression = string.Empty;
10    }
11}
12
13tableAdapter.Fill(targetTable);
14
15//恢復DataTable的Expression列,Fill完了之後進行統一的表達式計算
16for (int i = 0; i < targetTable.Columns.Count; i++)
17{
18    if (expressionKey.ContainsKey(targetTable.Columns[i].ColumnName))
19    {
20        targetTable.Columns[i].Expression =
21            (String)expressionKey[targetTable.Columns[i].ColumnName];
22    }
23}
24
25expressionKey.Clear();

最後測試一下效果如何

使用Northwind數據庫的Order Details表創建一個強類型類型化DataSet來進行測試(約2000多條數據 )。

追加了一個ItemTotal列  Expression = UnitPrice * Quantity

經測試性能比直接Fill大概提高 30%左右, 效果還是比較明顯的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved