打造自己的資料訪問層(一)

2022-02-27 17:02:08 字數 4118 閱讀 1650

專案開發中,大多數開發人員的核心工作就是如何對資料進行儲存及訪問。為了進行資料操作,我們首先得解決幾個基本問題:

1、如何與乙個資料庫建立連線。

2、如何從資料庫讀取相應的資料。

3、如何對資料表進行增改操作。

.net中,ado.net很方便的解決了上面三個問題,我們可以使用dbconnection進行連線,dataset進行資料儲存,dataadapter進行資料更新。先看一段**:

//

建立dbconnection物件連線資料庫

sqlconnection conn

=new

sqlconnection();

conn.connectionstring ="

server=.;uid=sa;password=123456; database=data_base; max pool size=300;";

//建立dataadapter、command物件,讀取資料

sqldataadapter da

=new

sqldataadapter();

sqlcommand cmd

=new

sqlcommand();

cmd.connection

=conn;

cmd.commandtext ="

select * from test";

da.selectcommand

=cmd;

//建立dataset物件,儲存資料,建立與物理表的對映

dataset ds

=new

dataset();

da.fill(ds,

"test");

上述**實現對資料庫「data_base」中「test」表資料讀取,並用dataset時行儲存。

既然讀出了test表中的資料,接下來要解決的就是如何對test表進行增、刪、改操作。

為實現增、刪、改操作,需要為dataadapter指定insertcommand、deletecommand以及updatecommand,並為每個command物件繫結引數:

//

新增資料

cmd

=new

sqlcommand();

cmd.connection

=conn;

cmd.commandtext ="

insert into test (id, name, val) values (@id, @name, @val)";

sqlparameter param

=new

sqlparameter(

"@id",

null

);param.sourcecolumn ="

id";cmd.parameters.add(param);

param

=new

sqlparameter(

"@name",

null

);param.sourcecolumn ="

name";

cmd.parameters.add(param);

param

=new

sqlparameter(

"@val",

null

);param.sourcecolumn ="

val"

;cmd.parameters.add(param);

da.insertcommand

=cmd;

//修改資料

cmd

=new

sqlcommand();

cmd.connection

=conn;

cmd.commandtext ="

update test set name = @name, val = @val where id = @id";

param

=new

sqlparameter(

"@id",

null

);param.sourcecolumn ="

id";cmd.parameters.add(param);

param

=new

sqlparameter(

"@name",

null

);param.sourcecolumn ="

name";

cmd.parameters.add(param);

param

=new

sqlparameter(

"@val",

null

);param.sourcecolumn ="

val"

;cmd.parameters.add(param);

da.updatecommand

=cmd;

//刪除資料

cmd

=new

sqlcommand();

cmd.connection

=conn;

cmd.commandtext ="

delete from test where id = @id";

param

=new

sqlparameter(

"@id",

null

);param.sourcecolumn ="

id";cmd.parameters.add(param);

da.deletecommand

=cmd;

完成準備工作後,利用datatable進行資料操作:

datatable dt 

=ds.tables[

"test"];

dt.primarykey

=new

datacolumn ;

dt.rows.add(

newobject

", datetime.now),

string

.format(

"測試值:

", datetime.now)

});datarow dr

=dt.rows.find(

"f8dc2c64-f51a-4e99-bde1-a20069b09c3a");

if(dr

!=null)"

, datetime.now);

}dr

=dt.rows.find(

"ed7d079b-81ec-4ba4-bf85-688621e495e7");

if(dr

!=null

)

最後呼叫dataadapter的update方法儲存變更後的資料:

da.update(ds, "test");

利用ado.net的上述方法,我們已經完成了對資料庫的完整操作。

注:上述**是利用dataadapter對資料庫進行讀寫的基本原理,非常重要,我們後面的改造都將以此作為依據。

雖然我們已經能完成對資料的操作,但現實際上還是存在很多問題:

1、我們只是對mssql資料庫進行操作,如果要對oracle或mysql進行操作我們得定義新的oracle或mysql資料物件,如果能由系統自動判斷操作的資料庫型別,我們就能省去對資料物件的關注。

2、我們做了太多的準備工作,我們只對一張表進行操作,如查我們要對多張表進行操作,引數又很多,實際上會產生大量的重複**,我們得考慮消除這些**。

對於上述問題,如果我們自己實現乙個資料訪問層,對ado.net物件進行封裝,只關注實際的資料的操作,而不關注系統是如何與資料庫進行連線、如何進行引數傳遞,那我們的需求就算基本滿足了。

我們可以先進行假設,需要達成如下效果,以偽碼的形式給出:

"test

", ds);

設定對映物件更新命令:map.setcommands(insert

|update

|delete, ds);

datatable進行實際增、刪、改操作。

資料執行者執行最後的變更操作:execobj.update(ds);

後面我將一步步看到上述假設是如何實現的。

資料訪問層

using system.collections.generic using system.data using system.data.common namespace adonetdataaccess.core.contract 上面的介面包括增刪改查,批量插入以及 資料庫連線物件的連線和關閉等...

資料訪問層

1 資料持久化 持久化是將程式中資料在瞬時狀態和持久狀態間轉換的機制。jdbc是一種持久化機制,將程式直接儲存成文字檔案也是持久化機制的一種實現。2 資料訪問模式 dao模式 dao dataaccessobjects,資料儲存物件 是指位於業務邏輯和持久化資料之間實現實現對持久化資料的訪問。dao...

資料訪問層

資料訪問層 一.持久化 是將程式中的資料在瞬間狀態和持久狀態間轉換的機制 二.主要持久化操作 1.儲存 2.刪除 3.修改 4.讀取 5.查詢 等 三.dao dataaccessobjects,資料儲存物件 指位於業務邏輯和持久化資料之間實現對持久化資料的訪問。四.dao模式的優勢 1.隔離了資料...