為數據訪問層編寫一個基類
2024-07-21 02:22:57
供稿:網友
在編寫數據訪問層代碼時,總要一邊又一邊的重復編寫:讀數據庫連接字符串,建立數據庫連接對象,打開連接,創建command對象,創建數據適配器,創建數據集,填充數據集,關閉連接。這種重復的代碼寫一兩次到還行,寫多了就免不了有一些煩了。
在總結以前的代碼以后,決定重構數據方法層的代碼。數據訪問層無非進行兩種操作:查詢返回datatable,進行插入、更新、刪除等無返回值的操作。只要增加一個數據訪問層基類包含這些繁瑣的代碼,其余的數據訪問層代碼繼承數據訪問層基類,在調用基類函數時給出存儲過程名稱和存儲過程參數即可。
數據訪問層基類代碼:
using system;
using system.data;
using system.collections;
using system.data.sqlclient;
namespace dal
{
/// <summary>
/// dalbase 的摘要說明。
/// 數據層訪問基類,定義數據層訪問公共的變量,方法
/// </summary>
public class dalbase
{
//定義該類共用變量
private sqlconnection conn; //
private sqlcommand mycm; //
private dataset myds; //
private sqldataadapter myda; //
/// <summary>
/// 從web.config中讀取數據庫連接字符串
/// </summary>
private string connstr = system.configuration.configurationsettings.appsettings["connectionstring"];
public dalbase()
{
//構造函數,創建對象實例
conn = new sqlconnection(connstr);
mycm = conn.createcommand();
myds = new dataset();
myda = new sqldataadapter();
}
/// <summary>
/// 通過存儲過程返回查詢表的信息
/// </summary>
/// <param name="sprocname">存儲過程名稱</param>
/// <returns>datatable</returns>
protected datatable gettable(string sprocname)
{
conn.open();
try
{
mycm.commandtext = sprocname;
mycm.commandtype = commandtype.storedprocedure;
myda.selectcommand = mycm;
myda.fill(myds);
}
finally
{
//無論語句執行正確與否,都關閉連接釋放資源
conn.close();
}
return myds.tables[0];
}
/// <summary>
/// 通過存儲過程和參數返回查詢表的信息
/// </summary>
/// <param name="sprocname"></param>
/// <param name="parameters"></param>
/// <returns></returns>
protected datatable gettable(string sprocname, sqlparameter[] parameters)
{
conn.open();
try
{
mycm.commandtext = sprocname;
mycm.commandtype = commandtype.storedprocedure;
sqlparametercollection sqlparams = mycm.parameters;
//先清空原有的參數
mycm.parameters.clear();
//給command添加參數
foreach ( sqlparameter parameter in parameters )
{
mycm.parameters.add( parameter );
}
myda.selectcommand = mycm;
myda.fill(myds);
}
finally
{
//無論語句執行正確與否,都關閉連接釋放資源
conn.close();
}
return myds.tables[0];
}
/// <summary>
/// 通過存儲過程及存儲過程參數執行對數據庫無返回值的操作(如:新增,更新,刪除等)
/// </summary>
/// <param name="sprocname">存儲過程名稱</param>
/// <param name="parameters">存儲過程參數</param>
protected void savetale(string sprocname, sqlparameter[] parameters)
{
mycm.commandtext = sprocname;
mycm.commandtype = commandtype.storedprocedure;
sqlparametercollection sqlparams = mycm.parameters;
//先清空原有的參數
mycm.parameters.clear();
//給command添加參數
foreach ( sqlparameter parameter in parameters )
{
mycm.parameters.add( parameter );
}
//打開連接
conn.open();
try
{
//執行
mycm.executenonquery();
}
finally
{
//關閉連接
conn.close();
}
}
}
}
數據訪問層代碼:
using system;
using system.data;
using system.collections;
using system.data.sqlclient;
namespace dal
{
public class test : dalbase
{
public test()
{
}
public datatable gettesttable()
{
return base.gettable("存儲過程名稱");
}
public datatable gettesttablebyxname(string xname)
{
sqlparameter[] parameters = { new sqlparameter( "@xname",sqldbtype.nvarchar,10 ) };
return base.gettable("存儲過程名稱",parameters);
}
public void addtesttable(string xname, string description)
{
sqlparameter[] parameters =
{
new sqlparameter( "@xname",sqldbtype.nvarchar,10 ),
new sqlparameter( "@description",sqldbtype.nvarchar,100)
};
//設置參數值
parameters[0].value = xname;
parameters[1].value = description;
base.savetale("存儲過程名稱",parameters);
}
}
}
大家有興趣還可以幫忙擴充一下這個基類,比如增加通過sql語句返回datatable,返回單值結果(如:查詢合計)……