張志強
摘 要:在Web應用軟件中,需要利用ADO.NET訪問數據庫中的數據。常規(guī)的數據訪問技術因訪問的數據量較大而需消耗大量的內存空間;同時網絡中的傳輸數據也會因數據量大而占用過多的帶寬,從而使軟件的整體性能降低。為提高軟件性能,對常規(guī)的數據訪問技術進行優(yōu)化研究,提出并設計按頁為單位訪問數據的優(yōu)化方案。因該優(yōu)化方案每次訪問的數據量較小,從而有效地解決了上述問題,在實際應用中有很大的意義。
關鍵詞:Web應用軟件;ADO.NET;數據訪問技術;優(yōu)化方案
中圖分類號:TP393.09文獻標識碼:A
文章編號:1004-373X(2009)12-039-03
Optimization Research of Data Access Technology Based on Web Environment
ZHANG Zhiqiang
(College of Information Science and Technology,Chengdu University,Chengdu,610106,China)
Abstract:In Web applications,it is necessary to access database by using ADO.NET.The conventional data access technology needs to consume a large amount of memory space,because in accessing,a large amount of data is needed.At the same time,in the network,too much bandwidth can be taken up if large amounts of data are transformed,so that the software′s overall performance is lowered.To enhance the performance of software,the paper carries out an optimization research on the conventional data access technology and designs an optimization program according to the data access which takes page as the unit.As the optimization program for each access needs only a small amount of data,the above problems are effectively solved,thus the program can be expected to play an important role in practice.
Keywords:Web application software;ADO.NET;data access technology;optimization program
0 引 言
在使用ASP.NET開發(fā)Web應用軟件的過程中,前臺客戶端經常需要從后臺數據庫中訪問數據,并在客戶端顯示與維護數據。常規(guī)的數據訪問操作是利用ADO.NET從后臺數據庫中訪問數據,填充到數據集(DataSet)中的數據表(DataTable)里,并將DataTable中的數據綁定到控件(GridView)中(實際就是在網絡中傳輸數據)。 當多個客戶端從后臺數據庫中訪問的數據量非常大時,會使DataTable中的數據量很大,在服務器端和客戶端將消耗大量的內存空間存放這些數據;同時當大量的數據在網絡中傳輸時也會占用過多的網絡帶寬,從而降低了整個應用軟件的性能。為了解決上述問題,需要優(yōu)化常規(guī)的數據訪問技術,減少訪問的數據量,從而提高應用軟件的整體性能。
1 數據訪問機制
從后臺數據庫中訪問數據是利用ADO.NET數據庫訪問接口技術實現數據的讀寫。ADO.NET的前身是ADO(ActiveX Data Objects),它是Microsoft.NETFramework的主要數據庫訪問技術,為用戶建立Web應用軟件提供了統(tǒng)一、一致的數據庫接口。在Visual Studio.NET開發(fā)環(huán)境下,利用該技術,采用C#開發(fā)語言實現基于Web環(huán)境的數據庫訪問操作。ADO.NET 是為基于消息的 Web 應用軟件而設計的,通過支持對數據的松耦合訪問,可減少與數據庫的活動連接數目(即減少了多個用戶爭用數據庫服務器上的有限資源的可能性),從而實現最大程度的數據共享。ADO.NET 還通過對分布式應用程序的基本對象DataSet,支持基于 XML 的持久性和傳輸格式,以實現最大程度的數據共享。DataSet是一種關系數據結構,使用 XML 進行訪問、寫入或序列化。ADO.NET中的DataSet使得生成要求應用層與多個 Web 站點之間進行松耦合數據交換的應用軟件變得很方便。
ADO.NET提供兩種數據訪問模式;一種為連接模式(Connected),與原來的ADO相兼容;另一種為非連接模式(Disconnected),這是ADO.NET中所提供的新技術。對于非連接模式,有許多優(yōu)點,可以有效地減少數據庫的連接數,降低為維護數據庫的連接而帶來的開銷,從而可以提高軟件的性能和規(guī)模。因此很多數據庫的訪問操作都采用非連接模式來完成,這也是常規(guī)數據訪問技術所采取的方式。
非連接模式的數據訪問機制主要是從后臺數據庫中訪問數據,并填充到DataSet中的DataTable對象里。然后將DataTable對象中的數據綁定到客戶端界面的數據表示控件上進行數據顯示與維護。常用的數據表示控件有GridView控件、DataList控件等。ADO.NET非連接模式下數據訪問操作的應用結構如圖1所示。
圖1 非連接模式的數據訪問機制
2 常規(guī)的數據訪問技術
如果后臺數據庫系統(tǒng)是SQL Server 2000或SQL Server 2005,常規(guī)數據訪問技術的實現是通過SqlDataAdapter對象執(zhí)行SQL語句來訪問數據庫中的數據,并填充到DataSet中的DataTable里。最后將DataTable中的數據綁定到GridView表中顯示與維護。實現的代碼如下:
SqlConnection con = new SqlConnection("Data Source=zzq;Initial Catalog= keyanIN;Persist Security Info=True;User ID=sa;Password=123;Pooling=true");
//建立數據庫連接對象,數據庫為SQL Server 2005,User ID為設置登錄數據庫的用戶名,
//Password為登錄數據庫的密碼,pooling=true表示打開連接池。
string s = "select * from stu";//執(zhí)行SQL語句訪問數據
SqlDataAdapter da = new SqlDataAdapter(s,con);
DataSet ds = new DataSet( );//建立數據集對象
da.Fill(ds,"student"); //填充數據到數據表student中
GridView1.DataSource = ds.Tables["student"].DefaultView;
GridView1.DataBind( );//將數據表student的數據綁定到GridView1控件
為了保證連接字符串的安全性,在實際應用中連接字符串不能出現在網頁程序中,其在Web.config文件中設置;然后利用代碼完成連接字符串的讀取,并建立SqlConnection連接對象。在Web.config文件中設置連接字符串的方式如下(conn為連接字符串名):
讀取連接字符串并建立連接對象的方式如下:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
當一頁無法顯示完數據時,需要考慮分頁技術來完成多頁的數據顯示,采用的方法很多,例如:利用GridView控件的自動分頁技術完成分頁操作。以這種常規(guī)技術訪問數據時,當訪問的數據量很大時,DataTable中的數據會很多,需要更多的內存空間來存儲數據;將DataTable中的數據綁定到控件中顯示時,因傳輸大量數據而占用更多的網絡帶寬,從而使系統(tǒng)的整體性能降低。要改變這種狀況,采用優(yōu)化的數據訪問技術,降低每次從數據庫中訪問的數據量,從而可有效地降低內存空間的消耗和所占網絡的帶寬。
3 優(yōu)化的數據訪問技術
優(yōu)化訪問技術的主要目的是降低從數據庫中訪問的數據量。按頁為單位訪問數據庫中的數據是一個很有效的方案。其訪問的數據量遠遠小于訪問所有數據的數據量。每頁的數據量可以動態(tài)地進行調整,以適應實際的需求。實現優(yōu)化技術,需要進行2步操作,第一,確定整個數據量的頁數,以及每頁的數據索引范圍;第二,修改訪問數據的SQL 語句,以每頁的數據索引范圍為單位訪問數據。這樣就可以實現只訪問每頁指定范圍的需求數據,而不是訪問所有的需求數據。實現原理如圖2所示。
圖2 優(yōu)化的數據訪問
下面用一個實例實現優(yōu)化方案。數據庫系統(tǒng)采用SQL Server 2005,數據庫中有3個數據表Unit,Employeer,keyan,分別為學校部門表、員工表、員工科研信息表。按職工姓名查詢其所有科研信息。實現的界面設計如圖3所示。
圖3 界面設計
3.1 分頁技術的實現
3.1.1 數據記錄的獲取
為了計算數據總頁數,需獲取數據記錄的總數,因此設計GetOrdersCount方法,以實現數據記錄總數的獲取。在該方法中,以員工姓名name作為動態(tài)參數進行動態(tài)查詢,并利用SQL語句中的count聚合函數獲取數據記錄總數。
public virtual int GetOrdersCount(string qury )
{ Database d = new Database();
string k;
k = "select count(Unit.Unit_Name) from Employeer,Unit,keyan where Employeer.Unit_ID=Unit.Unit_ID and Employeer.Employeer_ID=keyan.Employeer_ID and Employeer.Employeer_Name=@name";//設計的SQL語句
SqlConnection conn = … //利用前述的技術創(chuàng)建連接對象
conn.Open( );//打開連接
SqlCommand cmd = new SqlCommand(k,conn);
cmd.Parameters.Add("@name",SqlDbType.NVarChar,10);
cmd.Parameters["@name"].Value = qury;
//創(chuàng)建了帶參數查詢的命令對象,以name為查詢參數,qury為具體的查詢值
return (int)cmd.ExecuteScalar();//返回查詢的記錄條數
}
3.1.2 頁數的計算
通過執(zhí)行GetOrdersCount方法獲取數據記錄總數,并設置每頁訪問的數據量(假設每頁訪問10條記錄,每頁的記錄數可以根據需求進行更改),從而計算出數據總頁數。計算總頁數的實現代碼如下所示。
int count = this.GetOrdersCount(qury);// qury為具體的查詢值
int PagesCount = count / 10; // PagesCount為總頁數
int temp = count % 10;
if (temp != 0)
PagesCount++; //最后一頁不足10條記錄,任然為一頁累加到總頁數中
3.2 數據訪問技術的優(yōu)化實現
3.2.1 數據訪問的優(yōu)化設計
在數據訪問層的設計中,由GetData方法實現以頁為單位的數據訪問;該方法根據數據索引范圍對數據庫進行訪問,從而極大地減少了服務器與客戶機之間傳送的數據流量。數據索引范圍由起始索引號和終止索引號組成,其中起始索引號由頁號確定;終止索引號=起始索引號+每頁數據記錄條數。在GetData方法中,以參數startRowIndex為指定的起始索引號,以參數maximumRows為每頁數據記錄條數進行SQL語句的優(yōu)化設計,通過執(zhí)行優(yōu)化的SQL語句,完成指定范圍的數據訪問。
public DataView GetData(int startRowIndex,int maximumRows,string sortExpression,string qury)
{ //查詢指定索引范圍的數據,startRowIndex為起始索引號,maximumRows為查詢的記錄條數 ,sortExpression為對結果的排序條件,qury為查詢值。
string sql = @"with keyanTable as
(select Unit.Unit_Name,Employeer.Employeer_Name,Employeer.Employeer_Degree,Employeer.Employeer_zhicheng,keyan.Keyan_content,keyan.keyan_class,keyan.Declare_time,ROW_NUMBER() OVER(ORDER BY {0}) as RowNumber
from Employeer,Unit,keyan where Employeer.Unit_ID = Unit.Unit_ID and Employeer.Employeer_ID = keyan.Employeer_ID )
select * from keyanTable where RowNumber > {1} and RowNumber <= {2} and keyanTable.Employeer_Name = ‘{3};"; //優(yōu)化后的SQL語句
if (string.IsNullOrEmpty(sortExpression))
sortExpression = "Employeer.Employeer_ID ASC";
sql = string.Format(sql,sortExpression,startRowIndex,startRowIndex + maximumRows,qury);
// startRowIndex起始索引號;startRowIndex + maximumRows為終止索引號
SqlConnection conn = ……//利用前述的技術創(chuàng)建連接對象
SqlDataAdapter da = new SqlDataAdapter(sql,conn);
DataSet ds = new DataSet();
da.Fill(ds,”Information”);
return ds.Tables[“Information”].DefaultView;//返回數據視圖
}
3.2.2 表示層的設計
在客戶端,根據指定頁確定數據索引范圍的起始索引號,起始索引號通過公式:this.GetData(int.Parse(lb2.Text)×10-10計算得出。其中,int.Parse(lb2.Text)為客戶端指定的頁號,10為每頁的記錄數;每頁的數據訪問量以每頁的記錄條數為標準。 將動態(tài)生成的數據索引范圍作為參數執(zhí)行GetData方法,實現按照指定頁的數據索引范圍訪問數據。
…
string qurystr = TextBox8.Text.Trim();//獲取界面上的查詢值
DataView dv = this.GetData(int.Parse(lb2.Text) * 10 - 10,10,"Employeer.Employeer_ID DESC",qurystr);
// lb2.Text為訪問的頁號值 ,10為每頁的訪問的記錄數
GridView1.DataSource = dv;
GridView1.DataBind( );
4 結 語
對數據訪問技術進行優(yōu)化后,降低了對后臺數據庫的訪問數據量,進而減少了所占內存空間的大小,降低了在網絡中傳輸的數據量。該優(yōu)化方案提高了Web應用軟件運行的性能,在實際使用時有很大的意義。
參考文獻
[1]陳建國.開發(fā)高性能ADO.NET應用程序的探討[J].福建電腦,2007(1):177-178.
[2][美]Glenn Johnson.ADO.NET 2.0高級編程[M].段超,譯.北京:清華大學出版社,2006.
[3]陳永強.SQL Server 2005 Web應用開發(fā)[M].北京:清華大學出版社,2008.
[4]王強,滕剛.微軟培訓教材[Z].2008.
[5]李昕,常革新,崔杰.基于ADO.NET的ASP.NET頁面程序[J].遼寧工程技術大學學報:自然科學版,2006,25(2):250-252.
[6]王磊.基于.NET平臺的數據庫訪問技術[J].福建電腦,2006(12):75-89.
[7]孔延香,李永忠,郭秀峰.ADO.NET數據庫訪問技術研究與實現[J].現代電子技術,2005,28(16):51-52,59.
[8]林平榮.ADO.NET的數據庫訪問技術研究與實現[J].電腦知識與技術,2008,7(1):1 198-1 201.
[9]劉瑩.基于的ADO.NET數據庫訪問技術研究[J].電腦知識與技術,2008,18(2):1 580-1 582.
[10]陳平,池同柱.ADO.NET數據訪問模式選擇及優(yōu)化[J].福建電腦,2007(7):80,72.