摘要:該文以一個對數(shù)據(jù)庫的查詢?yōu)榫唧w實(shí)例,研究了DotNetNuke中數(shù)據(jù)源控件TableAdapter,以及該控件訪問數(shù)據(jù)庫的具體細(xì)節(jié),并解決了實(shí)際應(yīng)用中出現(xiàn)的使用TableAdapter訪問數(shù)據(jù)庫時可能出現(xiàn)的超時問題。
關(guān)鍵詞:dotNetNuke;tableAdapter;visualStudio;訪問數(shù)據(jù)庫超時
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2010)11-2576-02
DotNetNuke(簡稱DNN)由于其開源性和開發(fā)快速,被大量企業(yè)所應(yīng)用。其開發(fā)在Visual Studio中進(jìn)行,開發(fā)中可使用大量控件,極大的簡化了我們的開發(fā),但同時也有一些不足。例如TableAdapter控件,我們通過SQL Server2005的SQL Server profiler對其訪問數(shù)據(jù)庫的工作進(jìn)行跟蹤時發(fā)現(xiàn),DNN中TableAdapter的查詢方法訪問數(shù)據(jù)庫的時間均為30s,一旦超過30s訪問就會終止。針對該問題,本文給出了解決方案。對更好了解和進(jìn)行DNN的開發(fā),具有較大的參考價(jià)值。
1 什么是DotNetNuke
DotNetNuke(簡稱DNN)是一個免費(fèi)、開源、可擴(kuò)展、幾近完美的內(nèi)容管理系統(tǒng),同時DNN提供了強(qiáng)大的頁面管理功能(皮膚)。DNN可以廣泛應(yīng)用于商務(wù)網(wǎng)站、企業(yè)內(nèi)網(wǎng)和外網(wǎng)網(wǎng)站、在線內(nèi)容發(fā)布網(wǎng)站,是建立在微軟ASP.NET平臺上的一套WEB應(yīng)用框架。
2 TableAdapte控件
TableAdapter 提供應(yīng)用程序和數(shù)據(jù)庫之間的通信。TableAdapter連接到數(shù)據(jù)庫,執(zhí)行查詢或存儲過程,并返回用返回?cái)?shù)據(jù)填充的新數(shù)據(jù)表或是用返回?cái)?shù)據(jù)填充現(xiàn)有DataTable。 TableAdapter 通常包含 Fill 和 Update 方法,用于獲取和更新數(shù)據(jù)庫中的數(shù)據(jù)。
3 使用TableAdapte控件訪問數(shù)據(jù)庫
本實(shí)例采用微軟的C#語言進(jìn)行系統(tǒng)應(yīng)用開發(fā),使用MicroSoft SQL 2005做數(shù)據(jù)庫, 利用IIS服務(wù)器軟件來解釋執(zhí)行。下面說明實(shí)例的具體實(shí)現(xiàn)。
由于只是一個簡單查詢功能,因此數(shù)據(jù)表Student只建立五個有關(guān)學(xué)生基本信息的字段,建表如下:
首先,在DataSet中新建一個名為TableAdapter_searchStudent的TableAdapter,并且根據(jù)查詢的需要給TableAdapter_search添加一個select方法,方法名為:GetData_getstudent,方法為:
SELECT number, name, sex, age, class
FROM Student
WHERE (number LIKE '%' + @number + '%') AND (name LIKE '%' + @name + '%')
雖然我們只寫了這樣一些簡單的SQL語句,但實(shí)際上VisualStudio為我們做了許多的幕后工作。打開“類視圖”,我們可以在節(jié)點(diǎn)找到該查詢方法的具體定義,如下:
private void InitCommandCollection() {
this._commandCollection = new global::System.Data.SqlClient.SqlCommand[1];
this._commandCollection[0] = new global::System.Data.SqlClient.SqlCommand();
this._commandCollection[0].Connection = this.Connection;
this._commandCollection[0].CommandText = \"SELECT number, name, sex, age, class\\r\FROM Student\\r\WHERE (number LIKE \\'%\\' + @num\" +\"ber + \\'%\\') AND (name LIKE \\'%\\' + @name + \\'%\\')\";
this._commandCollection[0].CommandType = global::System.Data.CommandType.Text;
this._commandCollection[0].Parameters.Add(newglobal::System.Data.SqlClient.SqlParameter(\"@number\",global::System.Data.SqlDbType.VarChar,10,global::System.Data.ParameterDirection.Input, 0, 0, \"number\", global::System.Data.DataRowVersion.Current, 1, 1, \"\", \"\", \"\"));
this._commandCollection[0].Parameters.Add(newglobal::System.Data.SqlClient.SqlParameter(\"@name\",global::System.Data.SqlDbType.VarChar,50,global::System.Data.ParameterDirection.Input, 0, 0, \"name\", global::System.Data.DataRowVersion.Current, 1, 1, \"\", \"\", \"\"));}
public virtual DataSetStudent.TableAdapter_searchStudentDataTable GetData_getstudent(string number, string name) {
this.Adapter.SelectCommand = this.CommandCollection[0];
if ((number == 1)) {
throw new global::System.ArgumentNullException(\"number\");}
else {this.Adapter.SelectCommand.Parameters[0].Value = ((string)(number));}
if ((name == 1)) {
throw new global::System.ArgumentNullException(\"name\");}
else {this.Adapter.SelectCommand.Parameters[1].Value = ((string)(name));}
DataSetStudent.TableAdapter_searchStudentDataTable dataTable = new DataSetStudent.TableAdapter_searchStudentDataTable();
this.Adapter.Fill(dataTable);
return dataTable;}
以上代碼就是對GetData_getstudent方法的具體定義,這些代碼就是在我們利用圖形化界面進(jìn)行配置的時候自動生成的,可見使用控件為我們的開發(fā)節(jié)省了大量的時間。當(dāng)然,我們也可以根據(jù)需要對這些代碼進(jìn)行修改。比如文章開始提到的連接數(shù)據(jù)庫超時的問題。要修改此方法訪問數(shù)據(jù)庫的時間,就必須對訪問數(shù)據(jù)庫的時間進(jìn)行重新定義,其他的代碼均不用改變。因此我們將倒數(shù)第二句代碼改為如下代碼:
try
{
this.Adapter.SelectCommand.CommandTimeout = 您希望的時間;
this.Adapter.Fill(dataTable);
}
catch (System.Exception ex)
{ }
做以上修改之后,該方法訪問數(shù)據(jù)庫的時間就會更改為您的設(shè)置,而不是默認(rèn)的30s了.更主要的是,在這里做修改不會影響我們對控件的使用,就不會對我們的開發(fā)帶來影響。
3 總結(jié)
總而言之,利用Visual Studio進(jìn)行DNN模塊的開發(fā)時,要關(guān)注DNN的內(nèi)部機(jī)制以及它的一些默認(rèn)設(shè)置。就如本文中的TableAdapter,DNN就為它設(shè)置了默認(rèn)的訪問數(shù)據(jù)庫的時間。該文所提供的只是一個最簡單的解決方案,但是它也建立在對DNN內(nèi)部機(jī)制的理解和測試之上,DNN的內(nèi)部機(jī)制是很復(fù)雜的,我們花費(fèi)時間做更多的研究,并在實(shí)際中留心觀察和發(fā)現(xiàn)。
參考文獻(xiàn):
[1] 沃勒.DotNetNuke 4 高級編程[M].北京:清華大學(xué)出版社,2008.
[2] Young L.DotNetNuke For Dummies[M].吉林:吉林長白山出版社,2007.
[3] Archer T.C#技術(shù)揭秘[M].北京:機(jī)械工業(yè)出版社,2007.
[4] 鄭宇軍.C# 2.0程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2005.