|
隨著 .NET 平臺(tái)上,LINQ、ORM 框架、Dynamic Data、... 各種數(shù)據(jù)訪問技術(shù)不斷推陳出新,程序員也一直追著新技術(shù)跑,但對(duì)底層和代碼細(xì)節(jié)卻越來越難以掌控。當(dāng)項(xiàng)目性能需要調(diào)優(yōu)時(shí),通常也只能對(duì)數(shù)據(jù)庫(kù)加入更多索引,而多數(shù)人已難以對(duì)數(shù)據(jù)訪問的代碼優(yōu)化,且手寫 SQL 語(yǔ)句的功力似乎也持續(xù)退化中。
大家在拼命追求新技術(shù)時(shí),似乎已忘記微軟的 MCTS 證照,還有一門 ADO.NET 的科目 。且若有練好 ADO.NET 的基本功,當(dāng)項(xiàng)目遇到特殊需求時(shí),也才能手寫得出來。例如下圖 1 的「階層式下拉菜單 (Hierarchical DropDownList)」,功能很簡(jiǎn)單,在實(shí)務(wù)上也常遇到,但單純靠 DataSource 控件難以實(shí)現(xiàn),必須手寫 DataReader 來自定義細(xì)節(jié)。
本帖的示例下載點(diǎn):
http://files.cnblogs.com/WizardWu/100216.zip
(執(zhí)行第一個(gè)示例,需要 VS 2008 或 IIS,以及 SQL Server 的 Northwind 數(shù)據(jù)庫(kù))
(執(zhí)行第二個(gè)示例,需要 VS 2008 或 .NET 3.5,以及 SQL Server 的 AdventureWorks 數(shù)據(jù)庫(kù))
(執(zhí)行第二個(gè)示例,需要 VS 2008 或 .NET 3.5,以及 SQL Server 的 AdventureWorks 數(shù)據(jù)庫(kù))
一、DataReader 的變化應(yīng)用、用 Get 開頭的方法提升 DataReader 的性能
圖 1 以 DataReader 實(shí)現(xiàn)的 Hierarchical DropDownList
上圖 1 為本帖下載的第一個(gè)示例。在此 ASP.NET 示例中,我們不用 DataTable 以免速度較慢又浪費(fèi)內(nèi)存 (此卻為 DataSource 控件的默認(rèn)選擇),改用一個(gè) DataReader 對(duì)象,去兩個(gè)表中,各執(zhí)行一句 SQL SELECT 語(yǔ)句,最后將兩個(gè) result set 加載、合并到同一個(gè) DropDownList 中。我在以前寫的 C# 代碼生成器 ,也用過類似的小技巧。
此示例若您將前臺(tái)的 DropDownList 控件,換成微軟去年九月新推出的 ComboBox 這個(gè)可選也可輸入的 AJAX 下拉菜單控件 ,此示例的 Code-behind 一行代碼都不用改,直接就可套用至 ComboBox 上。

{
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
//利用分號(hào)「;」串連多句 SQL 語(yǔ)句,之后再一次丟進(jìn)數(shù)據(jù)庫(kù)去執(zhí)行,達(dá)成「批次(Batch)」讀取或更新數(shù)據(jù)庫(kù)的目的。
//此技巧亦適用于 INSERT、UPDATE、DELETE 的「批次」執(zhí)行。
cmd.CommandText = "SELECT TOP 5 CompanyName, CustomerID FROM Customers ; SELECT LastName, EmployeeID FROM Employees";
using (SqlDataReader dr = cmd.ExecuteReader())
{
DropDownList1.Items.Add("客戶列表");
int i = 1; //目前的數(shù)據(jù)行
while (dr.Read())
{
//.NET typed accessor
DropDownList1.Items.Add(" " + dr.GetString(0)); //數(shù)據(jù)庫(kù)跑循環(huán)取回的字段1 (Name),當(dāng)作選項(xiàng)的 Text
//.NET typed accessor
DropDownList1.Items[i].Value = dr.GetString(1); //數(shù)據(jù)庫(kù)跑循環(huán)取回的字段2 (ID),當(dāng)作選項(xiàng)的 Value
i++;
}
dr.NextResult(); //到下一個(gè) ResultSet
DropDownList1.Items.Add("員工列表");
i++;
while (dr.Read())
{
//.NET typed accessor
DropDownList1.Items.Add(" " + dr.GetString(0)); //數(shù)據(jù)庫(kù)跑循環(huán)取回的字段1 (Name) ,當(dāng)作選項(xiàng)的 Text
//Index-based accessor
DropDownList1.Items[i].Value = dr[1].ToString(); //數(shù)據(jù)庫(kù)跑循環(huán)取回的字段2 (ID),當(dāng)作選項(xiàng)的 Value
//亦可用 GetSql 開斗的方法 (Provider-specific typed accessor)
//DropDownList1.Items[i].Value = dr.GetSqlInt32(1).ToString(); //數(shù)據(jù)庫(kù)跑循環(huán)取回的字段2 (ID),當(dāng)作選項(xiàng)的 Value
i++;
}
}
}
}
NET技術(shù):DataReader 程序性能優(yōu)化,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。