国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

C#如何讓數(shù)據(jù)訪問(wèn)過(guò)程更透明

2024-07-21 02:29:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

    在編寫數(shù)據(jù)庫(kù)操作方法時(shí)我們經(jīng)常考慮方法內(nèi)部處理的connection, transaction等,主要方便以后不同方法進(jìn)行整合擴(kuò)展。但很多時(shí)候?qū)憯?shù)據(jù)庫(kù)操作方法都是封閉,在方法內(nèi)部打開connection或transaction處理;這樣即滿足現(xiàn)有需求的需要,要省下了調(diào)用方法所帶來(lái)的麻煩事(因?yàn)樵谡{(diào)用方法里必須定義connection等信息傳進(jìn)去)。雖然這樣滿足了現(xiàn)有的需求,但面對(duì)以后在功能擴(kuò)展需要整合幾個(gè)方法時(shí)問(wèn)題就產(chǎn)生了,因?yàn)榉椒ㄊ欠忾]的當(dāng)你需多個(gè)方法同時(shí)使用一個(gè)connection或transaction就必須修改原有方法;雖然可以對(duì)方法重載一個(gè)新版來(lái)適應(yīng)新的需要,但是代碼的修改和重構(gòu)也不是一件輕松的工作。

    簡(jiǎn)單地描述一下問(wèn)題:

    public void a()
    {
              ........
}

public void b()
{
       …….
}

  以上兩個(gè)方法單獨(dú)使用并沒(méi)有什么問(wèn)題,因?yàn)樗鼈兌际仟?dú)立的。當(dāng)出現(xiàn)下面情況又是如何呢?

public void c()
{
a();
b();
….
}

  在執(zhí)行這個(gè)方法時(shí)有可能要保證a和b里面的數(shù)據(jù)庫(kù)訪問(wèn)必須使用同一個(gè)connection,如果需要數(shù)據(jù)完全整性還要確保兩個(gè)方法的數(shù)據(jù)操作都必須使用同一個(gè)transaction。由于剛開始編寫a和b方法沒(méi)有考慮這些情況,這個(gè)時(shí)候我們能做的只有把a(bǔ)和b方法進(jìn)行重構(gòu)來(lái)滿足原有和現(xiàn)在的需要。

  如果我們不修改a和b就能滿足c的需要那是件多么好的事情,這樣開發(fā)人員就有更多的時(shí)間去處理業(yè)務(wù)相關(guān)的麻煩事情。有時(shí)想一下dotnet提供一個(gè)datacontext(數(shù)據(jù)庫(kù)操作上下文對(duì)象)該多好啊,在編寫數(shù)據(jù)庫(kù)操作代碼時(shí)不用關(guān)心使用什么的connection和transaction;通過(guò)當(dāng)前的datacontext來(lái)確定。雖然自己有這樣的想法去實(shí)現(xiàn),不過(guò)dotnet能提供是件最好不過(guò)的事情。

public void c()
{
    using(datacontext context = new datacontext())
{
a();
b();
….
}
}
public void d()
{
using(datacontext context = new datacontext())
{
c();
….
}
     }

  補(bǔ)充一下:

  其實(shí)在我的想法中datacontext不一定要顯式創(chuàng)建,可以通過(guò)配置的方式在中程序設(shè)置一個(gè)默認(rèn)的datacontext。以下代碼的功能沒(méi)有完全實(shí)現(xiàn)。

  table orders = new table("orders");
    table orderdetails = new table("[order details]");
    orderdetails.delete(orderdetails._orderid == 10500);
    orders.delete(orders._orderid == 10500);

  即使不用顯式創(chuàng)建datacontext 上面代碼也可以運(yùn)行。為了保證數(shù)據(jù)完整性可以這樣做:

using(transactioncontext tran = new transactioncontext())
{
    table orders = new table("orders");
    table orderdetails = new table("[order details]");
    orderdetails.delete(orderdetails._orderid == 10500);
    orders.delete(orders._orderid == 10500);
    tran.commit();

  在寫代碼的過(guò)程就可以把這些東西拋開,需要時(shí)候定義相應(yīng)的datacontext就可以了。

  如果需要高度透明性,只有一個(gè)datacontext是遠(yuǎn)遠(yuǎn)不夠的,必須提供相應(yīng)數(shù)據(jù)操作的封裝。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 曲沃县| 平和县| 沁水县| 衡阳市| 北碚区| 云林县| 和林格尔县| 安溪县| 灌阳县| 河池市| 青龙| 宾川县| 海丰县| 泽州县| 张家界市| 古蔺县| 尉氏县| 嘉定区| 望谟县| 绥滨县| 尼玛县| 鄂伦春自治旗| 江山市| 临高县| 榆中县| 邯郸市| 湖口县| 深圳市| 龙岩市| 昌邑市| 城步| 库车县| 菏泽市| 滨海县| 云南省| 申扎县| 沧州市| 西平县| 泽库县| 托克托县| 曲松县|