打造自己的数据访问层(三)
生活随笔
收集整理的這篇文章主要介紹了
打造自己的数据访问层(三)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
上一篇打造自己的數(shù)據(jù)訪問層(二)中,我們已具體實(shí)現(xiàn)了數(shù)據(jù)訪問層對應(yīng)的功能,該進(jìn)行收尾工作了,先來看段代碼,試試上一篇實(shí)現(xiàn)的功能:
View Code string sqlText = "SELECT ID, NAME, VAL FROM TEST";
string columns = "ID, NAME, VAL";
DataSet ds = new DataSet();
DataExecutor execObj = new MSSqlExecutor();
DataMapping map = new DataMapping();
map.ExecuteObject = execObj;
map.TableName = "TEST";
map.KeyColumns = "ID";
map.Columns = "ID, NAME, VAL";
DataMapping map = new DataMapping(execObj.GetInstant(), "TEST", "ID", columns);
map.Fill(sqlText, "TEST");
map.SetCommands(DataCommandType.Insert | DataCommandType.Update | DataCommandType.Delete, ds);
//DataTable方式進(jìn)行增、刪、改
bool isSuccess = execObj.Update();
果然已經(jīng)完成了對數(shù)據(jù)庫的讀寫操作了,至少不用再寫大段的參數(shù)傳遞代碼,功能都已經(jīng)實(shí)現(xiàn)了,是不是就完成了?
仔細(xì)看看上面的代碼,實(shí)際上還有問題尚未解決,看看這句:
DataExecutor execObj = new MSSqlExecutor();
竟然在代碼里直接實(shí)例化一個(gè)MSSql的執(zhí)行對象,這樣一開始提出的數(shù)據(jù)庫之間的切換問題根本就沒有從本質(zhì)上解決。
再回過頭來看上一篇,有一個(gè)方法public IDbConnection GetConn(),用來獲取數(shù)據(jù)連接對像,之前并沒有說明其如何實(shí)現(xiàn)。
我們知道DBConnection有兩個(gè)關(guān)鍵信息:
1、與哪種類型的數(shù)據(jù)庫產(chǎn)生連接,這個(gè)前面已經(jīng)解決了。
2、傳遞與數(shù)據(jù)庫連接的帳號信息、訪問庫信息的ConnectionString,這個(gè)并沒有提及。
看看第二點(diǎn)以前是怎么做的:
View Code public IDbConnection GetConn()
{
if (conn != null)
{
return conn;
}
conn = new SqlConnection();
conn.ConnectionString = 連接字串;
return conn;
}
上面出現(xiàn)了連接字串,這個(gè)字串從哪來?
總結(jié)下,要完成最終的數(shù)據(jù)訪問輸出,還需要解決兩個(gè)問題:
1、動態(tài)進(jìn)行不同數(shù)據(jù)庫之間的切換。
2、解決數(shù)據(jù)連接字串的來源問題。
接著就來解決這兩問題,先解決第二個(gè)問題,有個(gè)比較簡單的方法,將連接字串寫入配置文件中去,數(shù)據(jù)訪問層只需知道它傳遞過來KEY值:
<appSettings>
<add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
</appSettings>
第一個(gè)問題解決了,只剩下最后一個(gè)問題了,如何動態(tài)切換不同的數(shù)據(jù)庫,也就是說,在使用的時(shí)候不需要自己NEW一個(gè)對象,而是通過第三方來創(chuàng)建一個(gè)對象,實(shí)際上,設(shè)計(jì)模式里已提出了方案,創(chuàng)建型模式,有興趣的朋友可以自行研究,我們這里只需要用到簡單工廠模式:
View Code public sealed class ExecutorFactory
{
public static DataExecutor Create()
{
return Create(DatabaseType.MSSql);
}
public static DataExecutor Create(DatabaseType dbType)
{
AbstractDataBase dataBase = null;
Switch(dbType)
{
case DatabaseType.MSSql:
dataBase = new MSSqlDataBase();
break;
case DatabaseType.Oracle:
dataBase = new OracleDataBase();
break;
}
return dataBase.Create();
}
}
現(xiàn)在可對這句代碼進(jìn)行替換了:DataExecutor execObj = new MSSqlExecutor();
替換為:DataExecutor execObj = ExecutorFactory.Create();
至此,問題都解決了,切換數(shù)據(jù)庫是只需更改DatabaseType為相應(yīng)的數(shù)庫類型。?
接下來再考慮下,如果改變數(shù)據(jù)庫類型也不需要變動程序,能不能實(shí)現(xiàn)?
還是利用配置文件,只是此時(shí)提供的不是類型字串,而是實(shí)際的數(shù)據(jù)執(zhí)行者程序集信息,再利用.NET的天然優(yōu)勢反射可以實(shí)現(xiàn)了。
最終配置文件為:
<appSettings>
<add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
<add key="DBExecutor" value="FM.DataAccess, FM.DataAccess.MappingExcuter.MSSqlExecutor"></add>
</appSettings>
改造后的工廠:
View Code public sealed class ExecutorFactory
{
public static DataExecutor Create()
{
return Create(null);
}
public static DataExecutor Create(string dataBaseTypeKey)
{
return Create(dataBaseTypeKey, null);
}
public static DataExecutor Create(string dataBaseTypeKey, string connStrKey)
{
if (string.IsNullOrEmpty(dataBaseTypeKey))
{
dataBaseTypeKey = "DBExecutor";
}
string[] sltDataBaseType = ConfigReader.Read(dataBaseTypeKey).Split(',');
string asselblyName = sltDataBaseType[0];
string nameSpace = sltDataBaseType[1].Trim();
Assembly assembly = Assembly.Load(asselblyName);
DataExecutor execObj = assembly.CreateInstance(nameSpace) as DataExecutor;
execObj.SetConnectionString(connStrKey);
return execObj;
}
}
到此為止,數(shù)據(jù)訪問層最終完成,當(dāng)然這里還有很多問題有待解決,但其基本框架已形成了,以此為依據(jù),根據(jù)業(yè)務(wù)變化,實(shí)現(xiàn)自己的擴(kuò)展,不斷更新,最終才能真正形成完善的數(shù)據(jù)訪問層。
下面提供本文的示例代碼:
?數(shù)據(jù)訪問層示例
View Code string sqlText = "SELECT ID, NAME, VAL FROM TEST";
string columns = "ID, NAME, VAL";
DataSet ds = new DataSet();
DataExecutor execObj = new MSSqlExecutor();
DataMapping map = new DataMapping();
map.ExecuteObject = execObj;
map.TableName = "TEST";
map.KeyColumns = "ID";
map.Columns = "ID, NAME, VAL";
DataMapping map = new DataMapping(execObj.GetInstant(), "TEST", "ID", columns);
map.Fill(sqlText, "TEST");
map.SetCommands(DataCommandType.Insert | DataCommandType.Update | DataCommandType.Delete, ds);
//DataTable方式進(jìn)行增、刪、改
bool isSuccess = execObj.Update();
果然已經(jīng)完成了對數(shù)據(jù)庫的讀寫操作了,至少不用再寫大段的參數(shù)傳遞代碼,功能都已經(jīng)實(shí)現(xiàn)了,是不是就完成了?
仔細(xì)看看上面的代碼,實(shí)際上還有問題尚未解決,看看這句:
DataExecutor execObj = new MSSqlExecutor();
竟然在代碼里直接實(shí)例化一個(gè)MSSql的執(zhí)行對象,這樣一開始提出的數(shù)據(jù)庫之間的切換問題根本就沒有從本質(zhì)上解決。
再回過頭來看上一篇,有一個(gè)方法public IDbConnection GetConn(),用來獲取數(shù)據(jù)連接對像,之前并沒有說明其如何實(shí)現(xiàn)。
我們知道DBConnection有兩個(gè)關(guān)鍵信息:
1、與哪種類型的數(shù)據(jù)庫產(chǎn)生連接,這個(gè)前面已經(jīng)解決了。
2、傳遞與數(shù)據(jù)庫連接的帳號信息、訪問庫信息的ConnectionString,這個(gè)并沒有提及。
看看第二點(diǎn)以前是怎么做的:
View Code public IDbConnection GetConn()
{
if (conn != null)
{
return conn;
}
conn = new SqlConnection();
conn.ConnectionString = 連接字串;
return conn;
}
上面出現(xiàn)了連接字串,這個(gè)字串從哪來?
總結(jié)下,要完成最終的數(shù)據(jù)訪問輸出,還需要解決兩個(gè)問題:
1、動態(tài)進(jìn)行不同數(shù)據(jù)庫之間的切換。
2、解決數(shù)據(jù)連接字串的來源問題。
接著就來解決這兩問題,先解決第二個(gè)問題,有個(gè)比較簡單的方法,將連接字串寫入配置文件中去,數(shù)據(jù)訪問層只需知道它傳遞過來KEY值:
<appSettings>
<add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
</appSettings>
第一個(gè)問題解決了,只剩下最后一個(gè)問題了,如何動態(tài)切換不同的數(shù)據(jù)庫,也就是說,在使用的時(shí)候不需要自己NEW一個(gè)對象,而是通過第三方來創(chuàng)建一個(gè)對象,實(shí)際上,設(shè)計(jì)模式里已提出了方案,創(chuàng)建型模式,有興趣的朋友可以自行研究,我們這里只需要用到簡單工廠模式:
View Code public sealed class ExecutorFactory
{
public static DataExecutor Create()
{
return Create(DatabaseType.MSSql);
}
public static DataExecutor Create(DatabaseType dbType)
{
AbstractDataBase dataBase = null;
Switch(dbType)
{
case DatabaseType.MSSql:
dataBase = new MSSqlDataBase();
break;
case DatabaseType.Oracle:
dataBase = new OracleDataBase();
break;
}
return dataBase.Create();
}
}
現(xiàn)在可對這句代碼進(jìn)行替換了:DataExecutor execObj = new MSSqlExecutor();
替換為:DataExecutor execObj = ExecutorFactory.Create();
至此,問題都解決了,切換數(shù)據(jù)庫是只需更改DatabaseType為相應(yīng)的數(shù)庫類型。?
接下來再考慮下,如果改變數(shù)據(jù)庫類型也不需要變動程序,能不能實(shí)現(xiàn)?
還是利用配置文件,只是此時(shí)提供的不是類型字串,而是實(shí)際的數(shù)據(jù)執(zhí)行者程序集信息,再利用.NET的天然優(yōu)勢反射可以實(shí)現(xiàn)了。
最終配置文件為:
<appSettings>
<add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
<add key="DBExecutor" value="FM.DataAccess, FM.DataAccess.MappingExcuter.MSSqlExecutor"></add>
</appSettings>
改造后的工廠:
View Code public sealed class ExecutorFactory
{
public static DataExecutor Create()
{
return Create(null);
}
public static DataExecutor Create(string dataBaseTypeKey)
{
return Create(dataBaseTypeKey, null);
}
public static DataExecutor Create(string dataBaseTypeKey, string connStrKey)
{
if (string.IsNullOrEmpty(dataBaseTypeKey))
{
dataBaseTypeKey = "DBExecutor";
}
string[] sltDataBaseType = ConfigReader.Read(dataBaseTypeKey).Split(',');
string asselblyName = sltDataBaseType[0];
string nameSpace = sltDataBaseType[1].Trim();
Assembly assembly = Assembly.Load(asselblyName);
DataExecutor execObj = assembly.CreateInstance(nameSpace) as DataExecutor;
execObj.SetConnectionString(connStrKey);
return execObj;
}
}
到此為止,數(shù)據(jù)訪問層最終完成,當(dāng)然這里還有很多問題有待解決,但其基本框架已形成了,以此為依據(jù),根據(jù)業(yè)務(wù)變化,實(shí)現(xiàn)自己的擴(kuò)展,不斷更新,最終才能真正形成完善的數(shù)據(jù)訪問層。
下面提供本文的示例代碼:
?數(shù)據(jù)訪問層示例
轉(zhuǎn)載于:https://www.cnblogs.com/FlySoul/archive/2011/05/08/2040292.html
總結(jié)
以上是生活随笔為你收集整理的打造自己的数据访问层(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.装饰模式
- 下一篇: C++中固定长度短字符串比较是否相同,忽