使用反射實現多資料庫的支援

2021-04-02 09:04:33 字數 1470 閱讀 2847

現今資料庫行業中可供選擇的資料庫有很多,oracle,sql,access等等,而且不同的資料庫又有不同的標準,即使同樣由微軟推出的sql和access也有一些語句是sql支援而access不支援的,就更不要說其它的特性了。

那麼,如果我們的使用者是未知的,並不知道將來使用這個系統的使用者使用的是什麼資料庫,這時,我們就需要讓我們的系統支援多資料庫選擇了!

這裡我們以乙個簡單的web應用程式為例,我們需要這個系統能夠支援sql和access資料庫,而使用者可以選擇當前是使用sql還是使用access來做為資料庫。

其目的是從資料庫中讀取指定序號的資料,然後在頁面中進行修改,再將修改後的內容儲存進資料庫。

要實現這樣乙個功能我們需要兩個對資料庫的操作,乙個是從資料庫中讀取資料,乙個是將資料更新到資料庫中,因此我們先新增乙個抽象類dataprovider,其中有兩個可重寫的方法getdata()和updatedata(),再新增兩個類sqldataprovider和accessdataprovider,並從dataprovider繼承,以不同的實現方式重寫基類中的兩個方法。

問題也隨之而來,在程式的執行過程中是根據配置檔案中的內容來決定使用中個類來進行操作的,我們並

不知道應該例項化哪個類,或者呼叫哪個類的方法。這時我們就要使用者標題中所說的反射技術來實現,反射可以讓我們動態的例項化乙個類,或呼叫乙個方法。首先我們在配置檔案中給出sql的連線字串和資料操作類的全名,所謂全名大家可能見過,是以這樣的格式出現的

"包含完全命名空間的類名,該類所在的程式集的名稱",

這時我們就可以在程式中根據配置檔案中指定的資料操作類來例項化需要的類,並呼叫其方法!

**如下:

type type = null;

type = type.gettype("從配置檔案獲取的資料操作類全名");

//要尋找的建構函式所使用的引數型別集合

type paratypes = new type[2];

paratypes[0] = typeof(string);

paratypes[1] = typeof(string);

//獲取與引數型別集合相匹配的建構函式資訊

system.reflection.constructorinfo constructorinfoobj = type.getconstructor(paratypes);

//給要呼叫的建構函式的兩個引數賦值並將其放在乙個陣列中

object paraobj = new object[2];

paraobj[0] = "aaaa";

paraobj[1] = "bbbb";

//呼叫該建構函式

dataprovider dataprovider = (dataprovider)constructorinfoobj.invoke(paraobj);

這時就可以呼叫dataprovider的兩個方法來進行操作。

以上只是簡單的部分**。至於web.config中你是使用哪種方法來定義就跟據你自己的情況來決定了。

mybatis 多資料庫支援

當應用需要支援不同資料庫產商,並且依賴了不同資料庫特有的函式或者語法時,我們通常需要書寫2套或以上是sql來支援不同的場景。獲取列表 oracle 12c後使用listagg 而mysql使用group concat 其他場景 假設沒有標籤的情況下,我們可以如何實現我們的需求?我們用獲取列表的場景來...

專案支援多資料庫

基本與jdbc連線資料庫的 差不多,要支援多資料庫,最關鍵的是分頁的語句。解決思路 編寫乙個統一處理sql的方法,接收業務sql,根據不同的資料庫型別,返回最終處理好的分頁sql。repository public class basedao return ret 參考文件 mybatis 16my...

多資料庫的使用

方法1 array db connect mysql table zm visitors hkhk sjd where function query use market id query where market id market id where function query use date...