数据访问与sql语句的管理(一)
在開(kāi)發(fā)過(guò)程中數(shù)據(jù)訪問(wèn)是必不可少的。每個(gè)框架都會(huì)有自己數(shù)據(jù)訪問(wèn)機(jī)制。大家在一般的情況下會(huì)為自己的框架配備2套數(shù)據(jù)訪問(wèn)機(jī)制,ORM和DataHelper。當(dāng)然,根據(jù)項(xiàng)目的需要有時(shí)候也可能只一種。
其實(shí)這2個(gè)東西差不多被寫(xiě)爛了,我在這里再談數(shù)據(jù)訪問(wèn)可鼓足了很大的勇氣,如果寫(xiě)的不好請(qǐng)大家見(jiàn)諒。
首先說(shuō)說(shuō)需求。
1.???????快速的編寫(xiě)sql配置文件,很完善的配置文件驗(yàn)證和智能提示功能。
2.???????把sql語(yǔ)句按模塊劃分,都放在配置文件中。不再會(huì)出現(xiàn)程序中到處可見(jiàn)sql語(yǔ)句,和找不到sql語(yǔ)句的情況了。
3.???????修改sql語(yǔ)句再也不需要編譯程序集了。
4.???????數(shù)據(jù)訪問(wèn)對(duì)象抽象化。統(tǒng)一的數(shù)據(jù)訪問(wèn)對(duì)象,更換數(shù)據(jù)庫(kù)只修改web.config就可以了。程序完全不需要修改。
5.???????數(shù)據(jù)庫(kù)訪問(wèn)更簡(jiǎn)便。數(shù)據(jù)訪問(wèn)永遠(yuǎn)只需三步。獲取配置文件中的信息生成dbcommand(只需要指定一個(gè)key),給dbcommand中的參數(shù)賦值(參數(shù)對(duì)象已經(jīng)根據(jù)配置文件生成好了,你只需要賦值就可以了,其他的不用管。如果沒(méi)有參數(shù)這一步都省了),執(zhí)行這個(gè)dbcommand。
6.???????連接字符串統(tǒng)一管理,不管連接字符串是明文還是密文,都不需要修改任何程序。
寫(xiě)的比較抽象啊,往下看慢慢會(huì)明白。
首先說(shuō)說(shuō)sql配置文件。
寫(xiě)這個(gè)配置文件的時(shí)候和寫(xiě)webconfig一樣,智能提示,非常方便。而且支持多個(gè)系統(tǒng)集成,配置文件一共分三層,系統(tǒng)(一個(gè)文件)、模塊、sql語(yǔ)句。系統(tǒng)集成的時(shí)候把多個(gè)sql配置文件放一起,完全不沖突。而且管理sql語(yǔ)句更清晰,部署后調(diào)試修改sql更方便。
<?xml?version="1.0"?encoding="utf-8"??><!--配置說(shuō)明。<SqlConfig>
??<Module?moduleName="模塊名">
????<Sql?sqlName="sql語(yǔ)句名稱(chēng)"?text="sql語(yǔ)句或存儲(chǔ)過(guò)程名"?type="可以不指定,默認(rèn)為T(mén)ext">
??????<Parameters>
????????<add?parameterName="參數(shù)名"?defaultVaule="默認(rèn)值,如果沒(méi)有可以不指定。"?direction="可以不指定,默認(rèn)為Input"?dbType="可以不指定。默認(rèn)為String"/>
??????</Parameters>
??????<DynamicSql>
????????<add?parameterName="參數(shù)名"?dbType="可以不指定。默認(rèn)為String"?direction="可以不指定,默認(rèn)為Input"?filterText="必須指定,如果該參數(shù)賦值了,要?jiǎng)討B(tài)添加到sql語(yǔ)句中的查詢(xún)條件。"/>
??????</DynamicSql>
????</Sql>
??</Module>
</SqlConfig>--><!--示例
<SqlConfig>
??<Module?moduleName="module1">
????<Sql?sqlName="AllGroupName"?text="select?*?from?groups"?/>
????<Sql?sqlName="GetAllUserName"?text="select?username?from?users"?/>
????<Sql?sqlName="GetUserNameByGroupID"?text="select?username?from?users?where?groupid=@GroupID">
??????<Parameters>
????????<add?parameterName="@GroupID"?dbType="Int32"/>
??????</Parameters>
????</Sql>
????<Sql?sqlName="GetUserCount"?text="GetUserCount"?type="StoredProcedure">
??????<Parameters>
????????<add?parameterName="@GroupID"?defaultVaule="1"?dbType="Int32"?direction="Input"/>
????????<add?parameterName="@returnValue"?dbType="Int32"?direction="ReturnValue"/>
??????</Parameters>
????</Sql>
????<Sql?sqlName="test"?text="select?*?from?table?where?parm=@parm">
??????<Parameters>
????????<add?parameterName="@parm"/>
??????</Parameters>
??????<DynamicSql>
????????<add?parameterName="@parm1"?filterText="and?parm1=@parm1"/>
????????<add?parameterName="@parm2"?filterText="or?parm2=@parm2"/>
????????<add?parameterName="@parm3"?filterText="and?parm3=@parm3"/>
??????</DynamicSql>
????</Sql>
??</Module>
??<Module?moduleName="Product"></Module>
</SqlConfig>--><SqlConfig?xmlns="http://www.w3school.com.cn"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xsi:schemaLocation="http://www.w3school.com.cn?SqlStringConfigSchema.xsd"><Module?moduleName="CE.SqlString.SqlStringTest.Author"><Sql?sqlName="GetCity"?text="select?distinct?city?from?authors"?/><Sql?sqlName="GetState"?text="select?distinct?state?from?authors"?/><Sql?sqlName="SearchAuthors"?text="select?au_id,au_lname,au_fname,phone,address,city,state,zip,[contract]?from?authors?where?1=1"><DynamicSql><add?parameterName="@au_id"?filterText="and?au_id=@au_id"/><add?parameterName="@au_lname"?filterText="and?au_lname?like?'%'?+?@au_lname?+?'%'"/><add?parameterName="@au_fname"?filterText="and?au_fname?like?'%'?+?@au_fname?+?'%'"/><add?parameterName="@address"?filterText="and?address?like?'%'?+?@address?+?'%'"/><add?parameterName="@city"?filterText="and?city?=?@city"/><add?parameterName="@state"?filterText="and?state?=?@state"/><add?parameterName="@contract"?dbType="Boolean"?filterText="and?[contract]?=?@contract"/></DynamicSql></Sql><Sql?sqlName="GetAuthorInfo"?text="select?au_id,au_lname,au_fname,phone,address,city,state,zip,[contract]?from?authors?where?au_id=@au_id"><Parameters><add?parameterName="@au_id"/></Parameters></Sql><Sql?sqlName="UpdateAuthor"?text="update?authors?set?au_lname=@au_lname,au_fname=@au_fname,phone=@phone,address=@address,city=@city,state=@state,zip=@zip,[contract]=@contract?where?au_id=@au_id"><Parameters><add?parameterName="@au_lname"/><add?parameterName="@au_fname"/><add?parameterName="@phone"/><add?parameterName="@address"/><add?parameterName="@city"/><add?parameterName="@state"/><add?parameterName="@zip"/><add?parameterName="@contract"?dbType="Boolean"/><add?parameterName="@au_id"/></Parameters></Sql></Module></SqlConfig>
再說(shuō)說(shuō)數(shù)據(jù)訪問(wèn)。
永遠(yuǎn)的只需要三步,可以控制開(kāi)發(fā)人員編碼規(guī)范。都用這個(gè),不會(huì)一人寫(xiě)一個(gè),或者要用的時(shí)候自己open一個(gè)連接了。
//獲取command。command?=?DataHelper.SqlModule["GetAuthorInfo"].Command;//給參數(shù)賦值。command.Parameters["@au_id"].Value?=?au_id;//執(zhí)行它,DataHelper.Database是封裝的Enterprise?Library中的Database類(lèi)型。支持直接返回dataset,事務(wù)等等。不過(guò)我特別喜歡用datareader。using?(reader?=?DataHelper.Database.ExecuteReader(command)){if?(reader.Read())
????{
????????author?=?new?Author();
????????author.Au_id?=?reader[0].ToString();
????????author.Au_lname?=?reader[1].ToString();
????????author.Au_fname?=?reader[2].ToString();
????????author.Phone?=?reader[3].ToString();
????????author.Address?=?reader[4].ToString();
????????author.City?=?reader[5].ToString();
????????author.State?=?reader[6].ToString();
????????author.Zip?=?reader[7].ToString();
????????author.Contract?=?Convert.ToBoolean(reader[8].ToString());
????}
}
訪問(wèn)對(duì)象抽象化。
可以到到下面這個(gè)配置。
<connectionStrings><add?name="PubsConnectionString"?connectionString="Data?Source=.;Initial?Catalog=pubs;Persist?Security?Info=True;User?ID=sa;Password=sa"??????providerName="System.Data.SqlClient"?/></connectionStrings>
如果你是System.Data.SqlClient,那么dbcommand就是sqlcommand,dbcommand里面參數(shù)也是SqlParameter。
你是哪種providerName,我就可以自動(dòng)跟你生成那種command。暫時(shí)支持四種,System.Data.Odbc、System.Data.OleDb、System.Data.OracleClient和System.Data.SqlClient。
用興趣你自己加,俺不攔你,加好后給我cc一份就好了。
再看看上面connectionstring,你加密不加密都不需要改代碼,我們一樣讀的出來(lái)。當(dāng)然,你自己寫(xiě)個(gè)算法出來(lái)肯定是讀不出來(lái)的。你只能用RsaProtectedConfigurationProvider和DataProtectionConfigurationProvider加密。
總結(jié)
以上是生活随笔為你收集整理的数据访问与sql语句的管理(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天竺鼠为什么叫荷兰猪(天竺鼠和荷兰猪的区
- 下一篇: 关于MYsql 多字段排序