明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

面向?qū)ο笤跀?shù)據(jù)庫應(yīng)用程序中的應(yīng)用(dotNet)

[摘要]面向?qū)ο笤跀?shù)據(jù)庫應(yīng)用程序中的應(yīng)用(dotNet) 現(xiàn)在的應(yīng)用程序很大一部分都是與數(shù)據(jù)庫相關(guān)的程序,而寫數(shù)據(jù)庫程序會涉及到很多數(shù)據(jù)表,訪問和操縱數(shù)據(jù)表構(gòu)成了數(shù)據(jù)庫應(yīng)用程序最常見的動作,所...
面向?qū)ο笤跀?shù)據(jù)庫應(yīng)用程序中的應(yīng)用(dotNet)



現(xiàn)在的應(yīng)用程序很大一部分都是與數(shù)據(jù)庫相關(guān)的程序,而寫數(shù)據(jù)庫程序會涉及到很多數(shù)據(jù)表,訪問和操縱數(shù)據(jù)表構(gòu)成了數(shù)據(jù)庫應(yīng)用程序最常見的動作,所以,編寫出高效的程序?qū)τ诔绦騿T來說是不得不去考慮的。本文將討論這個話題,希望對讀者朋友有所裨益。



面向?qū)ο笫钱?dāng)今程序界的普遍編程思想,他具有三個最基本的特征:封裝、繼承和多態(tài)。繼承對于代碼的復(fù)用非常有效,多態(tài)則是指函數(shù)(方法)的多種形態(tài),可以通過子類重寫父類的方法來改變對象的行為,在面向?qū)ο缶幊讨衅鸬椒浅V匾淖饔。那么,在實際應(yīng)用中,到底能起到什么樣的作用呢?也許使用例子最能表達這個思想。



比如,我們要寫一個簡單的論壇程序,經(jīng)過分析,可以得出需要下面的表:用戶表(Users)、版塊表(BBSBlock)、回復(fù)表(Reply)、主題表(Topic)等(為了方便代碼的繼承,我把所有表的id號都設(shè)成相同的名稱:id)。對于這些表,都有一些相同的操作:瀏覽,刪除,添加和修改。那么,我們是不是對每個表都寫對應(yīng)的方法來實現(xiàn)呢?顯示,這種方法是笨拙的。而繼承,在這里就會發(fā)揮極為重要的作用。思想是:寫一個父類,把這些基本的操作寫好,然后,將每個表抽象成一個類,并繼承剛才創(chuàng)建的父類,此時,所有的子類都具有這些基本操作了。



我們可以這樣定義父類:

public class DBBaseClass

{

protected string TableName;//表名

protected SqlConnection con;//連接對象



public DBBaseClass():this("Users")

{

}

/// <summary>

/// 構(gòu)造函數(shù)

/// </summary>

/// <param name="TableName">表名</param>

public DBBaseClass(string TableName)

{

this.TableName = TableName;

if(con == null)

{

con = new SqlConnection("server=accp-lzh;database=MissBBS;uid=sa;pwd=sa");

}

else

{

if(con.State == ConnectionState.Open)

con.Close();

}

}



/// <summary>

/// 獲取數(shù)據(jù)集

/// </summary>

/// <param name="count">如果count為0,則獲取所有數(shù)據(jù)集,否則獲取指定條數(shù)(從頂部)的記錄</param>

/// <returns>返回DataSet</returns>

public DataSet Select(int count)

{

string sql;

if(count == 0)

sql = "select * from " + this.TableName ;

else

sql = "select top " + count.ToString() + " * from " + this.TableName + " oreder by id desc";

SqlCommand selectCmd = new SqlCommand(sql,con);



SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = selectCmd;



DataSet ds = new DataSet();

try

{

con.Open();

adapter.Fill(ds,"BBSTable");

con.Close();

}

catch(Exception)

{

return null;

}



return ds;

}



}



在這個類中,我們定義了兩個重載的構(gòu)造函數(shù)和一個用來獲取數(shù)據(jù)集的方法,同時,定義了兩個作用很大的字段,一個是表名,一個是連接對象。當(dāng)其他類繼承這個類時,就不再需要再次定義表和連接對象了,最主要是的,這兩個字段為我們更好的實現(xiàn)繼承起到了關(guān)鍵的作用。



接下來,我們創(chuàng)建一個子類:Users。這個類是表Users的抽象:

public class User : DBBaseClass

{

/// <summary>

/// 無參構(gòu)造函數(shù)

/// </summary>

public User():base("Users")

{

}



/// <summary>

/// 構(gòu)造函數(shù)

/// </summary>

/// <param name="TableName">表名</param>

public User(string TableName) : base(TableName)

{

}

}



現(xiàn)在,大家可以看出來,我們只是寫了該類的兩個構(gòu)造函數(shù),就具有返回表中所有數(shù)據(jù)集的功能了,因為該表繼承了DBBaseClass。



同樣,我們再寫一個子類:Topic,該類是表Topic的抽象。

public class Topic : DBBaseClass

{

public Topic() : base("Topic")

{

}



public Topic(string TableName) : base(TableName)

{

}

}



和User一樣,該類也同樣具有了返回所有數(shù)據(jù)集的功能。



實例化子類時,采用簡單對象工廠設(shè)計模式,返回不同類型的對象。

public class Factory

{

public Factory()

{



}



public static DBBaseClass GetObject(string TableName)

{

switch(TableName)

{

case "Users" :

return new User();



case "Topic":

return new Topic();



case "BBSBlock":

return new BBSBlock();



case "Reply":

return new Reply();



case "BBSMaster":

return new BBSMaster();



default:

return new DBBaseClass();

}

}

}



下面來看一看如何使用:

User user = (User)Factory.GetObject("Users");

DataSet ds1 = new DataSet();

ds1 = user.Select(0);



Topic topic = (Topic)Factory.GetObject("Topic");

DataSet ds2 = new DataSet();

ds2 = topic.Select(0);



看完之后,您有什么想法?如果您是一個經(jīng)驗豐富的程序員,這種方法肯定會經(jīng)常采用,如果您剛剛接觸,理解這種思想還是大有好處的。