微軟SqlHelper詳細解讀

2022-01-11 00:22:54 字數 3376 閱讀 7609

發現很少有人使用微軟sqlhelper,大多數人都是自己實現或把微軟的進行閹割。其原因大概有以下幾個:

1、有些人認為微軟的sqlhelper很多東西沒有必要,擔心影響效能。

2、微軟的sqlhelper有60多個方法,加上快取類有70多個。由於類的方法的低耦合使得原始碼閱讀困難。

3、自己實現也不難,因為是自己寫的,使用時思路更清晰,而且改動更靈活。

那是因為很多人看到這麼多方法給嚇著了,根本沒有把原始碼從頭到尾認真看一遍。就算看也是看幾個方法就看暈了,一大堆方法過載,各方法之間相互引用。

很不幸,本人就是看了幾次到中途就繞暈了的人。每當被繞暈的時候就總覺得,太沒必要了,微軟把簡單的東西給搞得這麼複雜,自己寫的簡單完全能滿足要求,就放棄了。

可前兩天發生一件事,讓我覺得是應該好好看看微軟的原版了,於時就有了下面這些筆記。

一、sqlhelper是密封類,並且不能例項化。

注意:微軟的sqlhelper類中並沒有讀寫配置檔案的**,像這樣「public static string connectionstring = configurationmanager.connectionstrings["connstring"].connectionstring;」。甚至,在類庫要通過新增.net元件system.configuration才能使用connectionmanager類,其原因就是它使sqlhelper的可移植性變差。你想想,如果沒有這行**,我把sqlhelper編譯成dll檔案,那麼這個dll在別的專案新增元件引用就可以使用了。如果有了這行**,編譯成dll檔案,在別的專案除了新增引用外,還要在配置檔案新增乙個連線字串,這個連線字元的名字是什麼呢?一般這個連線字串的名稱通過文件或口述方式獲取,如果在傳輸過程中丟失了,那這個dll還怎麼用。

二、對方法進行分類

這樣分一下類,應該清晰多了吧?(圖中用紅線圈的2區5個方法是對紅線1區5個方法的補充,一一對應。後面詳細講解它們之間的關係。)

從圖中我們看到,sqlhelper是由兩上類組成的,乙個是真正的sqlhelper內,另乙個是輔助類,為查詢操作提供快取。

為了簡便,我們先拋開快取類,那麼sqlhelper類可以分為兩部分,私有方法和公開方法。

注意:用藍線圈出來的是oledb下沒有executexmlreader方法,即:你要把這個類改成oledb的去掉藍線圈的幾個方法。

三、各個擊破之私有方法

sqlhelper類中私有方法只有5個,有1個私有的列舉。不多!

但是我們從下面這張圖可以看出它們的重要性

其中圖中最左邊兩個是「assignparametervalues」方法(2過載),作用是為引數列表賦值。

從右到左第二列的那個是「preparecommand 」方法,從圖中可看到它的地位可不一般,幾乎所有的類到最後都要呼叫它。其實它是職責是為執行命令作準備工作,比如最常見的開啟資料庫連線就在其中完成。它旁邊那個是它的小弟,作用是為命令新增引數。

最上面那乙個是「executereader 」,是資料閱讀器都最終都是呼叫了它。它和其他4個有些區別,注意區分。

四、各個擊破之公共方法

這個太多,我們以以其中乙個為準,詳細說明,其餘的以此類推。

前面第二節我們說:「圖中用紅線圈的2區5個方法是對紅線1區5個方法的補充,一一對應」,

我們這以第乙個方法為例(上圖中行號176——417的9個過載+行號1782——1867的三個方法),看看微軟是怎麼過載的。

文字一大堆,不如來個**直觀,各方法要求引數如下:

方法名稱

連線型別

執行t-sql語句

儲存過程

引數(帶*號的為可null)

1executenonquery

字串yes

yesno

2executenonquery

字串yes

yesyes*

3executenonquery

字串no

yesyes*

4executenonquery

連線物件

yesyes

no 5

executenonquery

連線物件

yesyes

yes*

6executenonquery

連線物件

noyes

yes*

7executenonquery

事務yes

yesno

8executenonquery

事務yes

yesyes*

9executenonquery

事務no

yesyes*

10executenonquerytypedparams

字串no

yesyes

11executenonquerytypedparams

連線物件

noyes

yes 12

executenonquerytypedparams

事務no

yesyes

看到沒有,方法雖多,但沒有重複的吧。你可能會說,怎麼沒重複的,第乙個和第二個就重複了,呼叫第二個方法如果沒引數傳個null不就和第乙個方法重複了麼?

其實,過載了這麼多就是為了消除可null引數,也就是說,在外部呼叫sqlhelper中方法時永遠不要為引數傳遞null值,如果不是為了這點,上面的12個方法完全可以壓縮成2個。

不信,我們就來試試看,是不是能壓縮成2個方法。先看張

這張圖是總圖的部分放大,由圖我們可以清楚的看到12個方法的引用關係,可以看到1、2、3、4、6、10、11最終都呼叫了5,12、7、9最終都呼叫了8.

也就是說,如果可以引數可以傳null的話,我們只需要5和8兩個方法就行了(乙個執行普通連線,乙個執行事務)。

由此可以推出,如果是全圖的話,就只要右邊三列的方法就可以了,其餘左邊三列都是對右邊三列的包裝。

為什麼不能使用可空引數?和前面提到的不推薦讀配置檔案是乙個道理,為了可移植性。因為在sqlhelper發布成dll後,呼叫時如何知道那些引數可接受null值那些引數不可接受null值呢!

到此為止吧,剩下的按也就是按這個思路來就行了,

最後補充一點,讀原始碼的時候在過載方法的xml注釋進行編號,容易閱讀。不然光靠引數來分辨容易搞暈。

像這樣,結合上面的**,就清楚的知道了第乙個方法引用的是第二個方法。

通過 為知筆記 發布

SqlHelper基於微軟官方的Helper

基於微軟官方的helper,把常用的方法封裝出來,簡化操作 public class sqlhelper return connstring 資料庫指令碼工具 public static int executenonquery string sql public static string exec...

詳細解讀mysql 詳細解讀MySQL中的許可權

一 前言 很多文章中會說,資料庫的許可權按最小許可權為原則,這句話本身沒有錯,但是卻是一句空話。因為最小許可權,這個東西太抽象,很多時候你並弄不清楚具體他需要哪些許可權。現在很多mysql用著root賬戶在操作,並不是大家不知道用root許可權太大不安全,而是很多人並不知道該給予什麼樣的許可權既安全...

詳細解讀restful

越來越多的人開始意識到,即軟體,而且是一種新型的軟體。這種 網際網路軟體 採用客戶端 伺服器模式,建立在分布式體系上,通過網際網路通訊,具有高延時 high latency 高併發等特點。開發,完全可以採用軟體開發的模式。但是傳統上,軟體和網路是兩個不同的領域,很少有交集 軟體開發主要針對單機環境,...