面向?qū)ο笤跀?shù)據(jù)庫(kù)應(yīng)用程序中的應(yīng)用 (dotNet) 現(xiàn)在的應(yīng)用程序很大一部分都是與數(shù)據(jù)庫(kù)相關(guān)的程序,而寫(xiě)數(shù)據(jù)庫(kù)程序會(huì)涉及到很多數(shù)據(jù)表,訪問(wèn)和操縱數(shù)據(jù)表構(gòu)成了數(shù)據(jù)庫(kù)應(yīng)用程序最常見(jiàn)的動(dòng)作,所以,編寫(xiě)出高效的程序?qū)τ诔绦騿T來(lái)說(shuō)是不得不去考慮的。本文將討論
面向?qū)ο笤跀?shù)據(jù)庫(kù)應(yīng)用程序中的應(yīng)用(dotNet)
現(xiàn)在的應(yīng)用程序很大一部分都是與數(shù)據(jù)庫(kù)相關(guān)的程序,而寫(xiě)數(shù)據(jù)庫(kù)程序會(huì)涉及到很多數(shù)據(jù)表,訪問(wèn)和操縱數(shù)據(jù)表構(gòu)成了數(shù)據(jù)庫(kù)應(yīng)用程序最常見(jiàn)的動(dòng)作,所以,編寫(xiě)出高效的程序?qū)τ诔绦騿T來(lái)說(shuō)是不得不去考慮的。本文將討論這個(gè)話題,希望對(duì)讀者朋友有所裨益。
面向?qū)ο笫钱?dāng)今程序界的普遍編程思想,他具有三個(gè)最基本的特征:封裝、繼承和多態(tài)。繼承對(duì)于代碼的復(fù)用非常有效,多態(tài)則是指函數(shù)(方法)的多種形態(tài),可以通過(guò)子類(lèi)重寫(xiě)父類(lèi)的方法來(lái)改變對(duì)象的行為,在面向?qū)ο缶幊讨衅鸬椒浅V匾淖饔谩D敲矗趯?shí)際應(yīng)用中,到底能起到什么樣的作用呢?也許使用例子最能表達(dá)這個(gè)思想。
比如,我們要寫(xiě)一個(gè)簡(jiǎn)單的論壇程序,經(jīng)過(guò)分析,可以得出需要下面的表:用戶(hù)表(Users)、版塊表(BBSBlock)、回復(fù)表(Reply)、主題表(Topic)等(為了方便代碼的繼承,我把所有表的id號(hào)都設(shè)成相同的名稱(chēng):id)。對(duì)于這些表,都有一些相同的操作:瀏覽,刪除,添加和修改。那么,我們是不是對(duì)每個(gè)表都寫(xiě)對(duì)應(yīng)的方法來(lái)實(shí)現(xiàn)呢?顯示,這種方法是笨拙的。而繼承,在這里就會(huì)發(fā)揮極為重要的作用。思想是:寫(xiě)一個(gè)父類(lèi),把這些基本的操作寫(xiě)好,然后,將每個(gè)表抽象成一個(gè)類(lèi),并繼承剛才創(chuàng)建的父類(lèi),此時(shí),所有的子類(lèi)都具有這些基本操作了。
我們可以這樣定義父類(lèi):
public class DBBaseClass
{
protected string TableName;//表名
protected SqlConnection con;//連接對(duì)象
public DBBaseClass():this("Users")
{
}
///
/// 構(gòu)造函數(shù)
///
/// 表名
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();
}
}
///
/// 獲取數(shù)據(jù)集
///
/// 如果count為0,則獲取所有數(shù)據(jù)集,否則獲取指定條數(shù)(從頂部)的記錄
///
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è)類(lèi)中,我們定義了兩個(gè)重載的構(gòu)造函數(shù)和一個(gè)用來(lái)獲取數(shù)據(jù)集的方法,同時(shí),定義了兩個(gè)作用很大的字段,一個(gè)是表名,一個(gè)是連接對(duì)象。當(dāng)其他類(lèi)繼承這個(gè)類(lèi)時(shí),就不再需要再次定義表和連接對(duì)象了,最主要是的,這兩個(gè)字段為我們更好的實(shí)現(xiàn)繼承起到了關(guān)鍵的作用。
接下來(lái),我們創(chuàng)建一個(gè)子類(lèi):Users。這個(gè)類(lèi)是表Users的抽象:
public class User : DBBaseClass
{
///
/// 無(wú)參構(gòu)造函數(shù)
///
public User():base("Users")
{
}
///
/// 構(gòu)造函數(shù)
///
/// 表名
public User(string TableName) : base(TableName)
{
}
}
現(xiàn)在,大家可以看出來(lái),我們只是寫(xiě)了該類(lèi)的兩個(gè)構(gòu)造函數(shù),就具有返回表中所有數(shù)據(jù)集的功能了,因?yàn)樵摫砝^承了DBBaseClass。
同樣,我們?cè)賹?xiě)一個(gè)子類(lèi):Topic,該類(lèi)是表Topic的抽象。
public class Topic : DBBaseClass
{
public Topic() : base("Topic")
{
}
public Topic(string TableName) : base(TableName)
{
}
}
和User一樣,該類(lèi)也同樣具有了返回所有數(shù)據(jù)集的功能。
實(shí)例化子類(lèi)時(shí),采用簡(jiǎn)單對(duì)象工廠設(shè)計(jì)模式,返回不同類(lèi)型的對(duì)象。
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();
}
}
}
下面來(lái)看一看如何使用:
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);
看完之后,您有什么想法?如果您是一個(gè)經(jīng)驗(yàn)豐富的程序員,這種方法肯定會(huì)經(jīng)常采用,如果您剛剛接觸,理解這種思想還是大有好處的。
posted on 2004年08月19日 3:28 PM
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com