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