所有寫資料庫應用的都會遇到sqlhelper。每個人實現的也不同,網上現成的例子也很多。但在實際操作中,大部分都不實用。什麼樣的才是實用的?答:適合應用場景的!
下面來介紹下我寫的乙個關於oracle的sqlhelper。沒有進行大規模及效能測試。
首先來說下為什麼寫這個sqlhelper。在以往的桌面程式開發中,我遇到最多的sql操作,一般不會涉及多個表同時操作,即使有,在使用sqlhelper時用乙個transaction就可以了。
但現在場景換了。在web裡我們將業務操作與具體資料庫操作分離了成 ba 與da(人為強制性的)。在ba裡對業務操作進行必要的檢測,然後呼叫da讀寫資料。ba可以供其它ba操作時復用。
在復用時,我們要確保多個以及多級ba在同乙個事務(如果需要)裡,同時ba只能訪問自己的da。這樣的操作環境催生了現在我要展示的sqlhelper。然而,當我寫完了這個sqlhelper後,發現它可以很好的完成桌面以及web應用中對sql的操作。下面是桌面應用的測試用例
public class ta : blo','') returning ddid into :result";//注意結尾不需要使用 ;
trans.sqlhelper.commandtext = string.format(sql, "2001", "測試項");
var para = new oracleparameter("result", oracletype.number);
para.direction = parameterdirection.output;
trans.sqlhelper.addparameter(para);
trans.sqlhelper.execute();
return convert.toint32(para.value);
}public void add()
','')";
trans.sqlhelper.commandtext = string.format(sql, "2001", "測試項");
trans.sqlhelper.execute();}}
public class tb : blo
','','')";
trans.sqlhelper.commandtext = string.format(sql, "2000", "1", "測試項一");
trans.sqlhelper.execute();
}public string getmaxdicname()
}public class tc : blo
','',)";
trans.sqlhelper.commandtext = string.format(sql, "2000", "1");
trans.sqlhelper.execute();
}public void update()
' where ddid = 2000";
trans.sqlhelper.commandtext = string.format(sql, "值");
trans.sqlhelper.execute();}}
測試**
//直接使用sqlhelper的情況private void button1_click(object sender, eventargs e))}
}}
//使用業務邏輯建立乙個事務。將所有的操作包含在同一事務裡
private void button2_click(object sender, eventargs e)
;//var b = new tb();
var c = new tc();
a.trans.addbusiness(c);
trycatch (exception ex)
}//插入之後返回值,如自增id
private void button3_click(object sender, eventargs e)
catch (exception ex)}/*
在乙個事務裡,對n個表進行操作(1)。
這時有其它的連線對相同的表操作。操作是按正常情況執行(2)。
若(2)使用(1)表中的結果,那麼如果(1)的事務未提交,則(2)無法訪問(1)中最新的值
*/ private void button4_click(object sender, eventargs e)
catch (exception ex)
}private void button5_click(object sender, eventargs e)
catch (exception ex)
}private void button6_click(object sender, eventargs e)
catch (exception ex)
}//外層事務,內層獨立事務
private void button7_click(object sender, eventargs e)
catch (exception)
trycatch (exception)
a.trans.commit();
}catch (exception ex)}}
看完以上**。你現在最關心的是如何實現事務共享的,以及如何區分事務的所有者及是否可以進行提交。
秘密其實很簡單,能過三個地方來控制項。
1、是否共享
public class blo
為業務物件基類,我給它乙個事務控制的屬性物件 public trans trans
2、trans 物件為事務控制器。給它設定乙個屬性 public bool isinherited
用於標識它的事務是否從其它事務得來的。
3、blo 的 trans 的屬性讀寫器
public trans trans;return _trans;
}set
_trans.sqlhelper = value.sqlhelper;
_trans.isinherited = true;}}
通過這三個地方我們就完全可以控制項事務的統一訪問了。
說了這麼多還是把dll檔案上傳上來。如果哪個兄弟有心可以對此dll進行效能測試。當然需要.net 4
在論壇如何寫好原創技術貼
1 原創。但凡是被 無數次的文字,肯定是一篇原創。這個的原創更應傾向於對某個技術點實際案例的說明,更或者是講之前大家熱議的話題開貼詳細說明個人的技術方案和觀點。2 易懂。乙個技術點用最簡單易懂的方式表現出來,那就說明了作者不僅擁有技術,而且能夠授人以漁。表現易懂的最好的方式就是 並茂,一開始大家可以...
如何寫 如何寫好指令碼?
好的指令碼當然要有好的開場白 好的開題 破題 話題引入,好的敘述與分析 好的結束語。好的指令碼還應有好的輔助說明的素材,700 800字的指令碼,對應的素材數量如下 非真人出鏡者 素材數量需要翻倍,最好找到超過20個素材。寫好指令碼還應注意以幾點 一 開門見山 快速切入主題,這樣的話就更容易讓觀眾對...
如何寫好簡歷
在簡歷控修改的簡歷中,最常見的問題就是簡歷太羅嗦,這並不是說簡歷的頁數太多,或者篇幅太多,而是內容太羅嗦,從標題往下讀,五行之內都看不到重點。這樣的簡歷別說是一天收到成百上千份簡歷的hr,隨便抓乙個路人甲乙丙都沒有耐心讀下去。有的同學會問,什麼是重點?我覺得我的簡歷都是重點,刪掉哪乙個都不行。那麼嘗...