需求:
解決方案:
1:如果用maction操作,可能會如下代碼:
using(maction action=new maction(表名))
{
if(action.fill(id))
action.set(字段名,action.get<int>(字段名)+1);
action.update();
}
簡單的說,就是需要查詢出值,然後再用原值進行相關的操作,用這種代碼代價就是要多查一次。
2:另一種方式高性能的是使用mproc來直接操作sql語句,可能會如下代碼:
using(mproc proc=new proc("update 表名 set 字段名=字段名+1"))
proc.exenonquery();
用mproc基本是萬能的了,直接處理sql語句和存儲過程。。。
大夥習慣了maction多,是以希望maction也有個順路功能:
不過好多人習慣用maction,都圖個友善,連條sql語句也想省一下。。。
事實上,我本人在多個項目中,也有這種需求,當然最後都是直接使用mproc處理了。
很多時候,我一直在尋找一種最優方式,能處理這種值+1,值-1的問題,不過每每看着架構,不好下手,一直沒找到切入點和使用方法。
比如一開始想的:
action.set(字段名,“[字段名]+1”);
action.update("id=1");
但是這種方式,實作起來,沒想象的簡單,而且這值是字元串還是表達式?分不清也說不明,是以一直卡在以何種使用方式上。
cyq.data 架構設計原則:
cyq.data 架構的設計,很多時候,是先思考使用的方法,再去想怎麼實作的,先想象出最簡單的使用方式,再去想能不能實作,而不是實作了一個功能,卻很難使用。
為此,但網友又對我提出這種需求的要求時,我又花了n個小時,看着代碼發呆,每次我思考問題或有某項功能時,我都會看着代碼發呆幾個小時。。當然是在不停的思考。。
後來終于設計出最終解決方案:
action.set(字段名,值);
action.setexpression(“字段名=字段名+1”);
action.setexpression(“字段名=len(字段名)+1”);
action.update();
通過增加一個表達式方法,基本上有點萬能了,事實在後端,組成的update語句大體為:
update 表名 set 表達式,字段名=@字段名 where ...
簡單說,就是表達式隻是簡單的被附加到原來的set的後面,最終被組裝成sql執行,當然了,如果你想進階點用參數化也是可以的。
using (maction action = new maction("blog_class"))
{
action.setexpression("count=count+@value");//表達式更新帶參數化。
action.setpara("value", 2, dbtype.int32);//設定參數化值
action.update();
}
到此,基本上有表達存在,可以處理n種不同的需求了,友善性提升了不少。
補充:
不小心把文章“隻允許注冊使用者通路”給打上勾了,結果發現注冊使用者的閱讀數僅88,根據統計,還有近27個是為了看文章被逼登陸了一下。
周末的行情通路量這麼低?大夥都跑哪去偷情了?
版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:
http://www.cnblogs.com/cyq1162/archive/2013/05/05/3060543.html