物件導向在資料庫應用程式中的應用(dotNet)

來源:互聯網
上載者:User
程式|對象|資料|資料庫 物件導向在資料庫應用程式中的應用(dotNet)



現在的應用程式很大一部分都是與資料庫相關的程式,而寫資料庫程式會涉及到很多資料表,訪問和操縱資料表構成了資料庫應用程式最常見的動作,所以,編寫出高效的程式對於程式員來說是不得不去考慮的。本文將討論這個話題,希望對讀者朋友有所裨益。



物件導向是當今程式界的普遍編程思想,他具有三個最基本的特徵:封裝、繼承和多態。繼承對於代碼的複用非常有效,多態則是指函數(方法)的多種形態,可以通過子類重寫父類的方法來改變對象的行為,在物件導向編程中起到非常重要的作用。那麼,在實際應用中,到底能起到什麼樣的作用呢?也許使用例子最能表達這個思想。



比如,我們要寫一個簡單的論壇程式,經過分析,可以得出需要下面的表:使用者表(Users)、版塊表(BBSBlock)、回複表(Reply)、主題表(Topic)等(為了方便代碼的繼承,我把所有表的id號都設成相同的名稱:id)。對於這些表,都有一些相同的操作:瀏覽,刪除,添加和修改。那麼,我們是不是對每個表都寫對應的方法來實現呢?顯示,這種方法是笨拙的。而繼承,在這裡就會發揮極為重要的作用。思想是:寫一個父類,把這些基本的操作寫好,然後,將每個表抽象成一個類,並繼承剛才建立的父類,此時,所有的子類都具有這些基本操作了。



我們可以這樣定義父類:

public class DBBaseClass

{

protected string TableName;//表名

protected SqlConnection con;//連線物件



public DBBaseClass():this("Users")

{

}

/// <summary>

/// 建構函式

/// </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>

/// 擷取資料集

/// </summary>

/// <param name="count">如果count為0,則擷取所有資料集,否則擷取指定條數(從頂部)的記錄</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;

}



}



在這個類中,我們定義了兩個重載的建構函式和一個用來擷取資料集的方法,同時,定義了兩個作用很大的欄位,一個是表名,一個是連線物件。當其他類繼承這個類時,就不再需要再次定義表和連線物件了,最主要是的,這兩個欄位為我們更好的實現繼承起到了關鍵的作用。



接下來,我們建立一個子類:Users。這個類是表Users的抽象:

public class User : DBBaseClass

{

/// <summary>

/// 無參建構函式

/// </summary>

public User():base("Users")

{

}



/// <summary>

/// 建構函式

/// </summary>

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

public User(string TableName) : base(TableName)

{

}

}



現在,大家可以看出來,我們只是寫了該類的兩個建構函式,就具有返回表中所有資料集的功能了,因為該表繼承了DBBaseClass。



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

public class Topic : DBBaseClass

{

public Topic() : base("Topic")

{

}



public Topic(string TableName) : base(TableName)

{

}

}



和User一樣,該類也同樣具有了返回所有資料集的功能。



執行個體化子類時,採用簡單對象工廠設計模式,返回不同類型的對象。

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);



看完之後,您有什麼想法?如果您是一個經驗豐富的程式員,這種方法肯定會經常採用,如果您剛剛接觸,理解這種思想還是大有好處的。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。