数据访问与sql语句的管理(一)
在開發過程中數據訪問是必不可少的。每個框架都會有自己數據訪問機制。大家在一般的情況下會為自己的框架配備2套數據訪問機制,ORM和DataHelper。當然,根據項目的需要有時候也可能只一種。
其實這2個東西差不多被寫爛了,我在這里再談數據訪問可鼓足了很大的勇氣,如果寫的不好請大家見諒。
首先說說需求。
1.???????快速的編寫sql配置文件,很完善的配置文件驗證和智能提示功能。
2.???????把sql語句按模塊劃分,都放在配置文件中。不再會出現程序中到處可見sql語句,和找不到sql語句的情況了。
3.???????修改sql語句再也不需要編譯程序集了。
4.???????數據訪問對象抽象化。統一的數據訪問對象,更換數據庫只修改web.config就可以了。程序完全不需要修改。
5.???????數據庫訪問更簡便。數據訪問永遠只需三步。獲取配置文件中的信息生成dbcommand(只需要指定一個key),給dbcommand中的參數賦值(參數對象已經根據配置文件生成好了,你只需要賦值就可以了,其他的不用管。如果沒有參數這一步都省了),執行這個dbcommand。
6.???????連接字符串統一管理,不管連接字符串是明文還是密文,都不需要修改任何程序。
寫的比較抽象啊,往下看慢慢會明白。
首先說說sql配置文件。
寫這個配置文件的時候和寫webconfig一樣,智能提示,非常方便。而且支持多個系統集成,配置文件一共分三層,系統(一個文件)、模塊、sql語句。系統集成的時候把多個sql配置文件放一起,完全不沖突。而且管理sql語句更清晰,部署后調試修改sql更方便。
<?xml?version="1.0"?encoding="utf-8"??><!--配置說明。<SqlConfig>
??<Module?moduleName="模塊名">
????<Sql?sqlName="sql語句名稱"?text="sql語句或存儲過程名"?type="可以不指定,默認為Text">
??????<Parameters>
????????<add?parameterName="參數名"?defaultVaule="默認值,如果沒有可以不指定。"?direction="可以不指定,默認為Input"?dbType="可以不指定。默認為String"/>
??????</Parameters>
??????<DynamicSql>
????????<add?parameterName="參數名"?dbType="可以不指定。默認為String"?direction="可以不指定,默認為Input"?filterText="必須指定,如果該參數賦值了,要動態添加到sql語句中的查詢條件。"/>
??????</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>
再說說數據訪問。
永遠的只需要三步,可以控制開發人員編碼規范。都用這個,不會一人寫一個,或者要用的時候自己open一個連接了。
//獲取command。command?=?DataHelper.SqlModule["GetAuthorInfo"].Command;//給參數賦值。command.Parameters["@au_id"].Value?=?au_id;//執行它,DataHelper.Database是封裝的Enterprise?Library中的Database類型。支持直接返回dataset,事務等等。不過我特別喜歡用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());
????}
}
訪問對象抽象化。
可以到到下面這個配置。
<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里面參數也是SqlParameter。
你是哪種providerName,我就可以自動跟你生成那種command。暫時支持四種,System.Data.Odbc、System.Data.OleDb、System.Data.OracleClient和System.Data.SqlClient。
用興趣你自己加,俺不攔你,加好后給我cc一份就好了。
再看看上面connectionstring,你加密不加密都不需要改代碼,我們一樣讀的出來。當然,你自己寫個算法出來肯定是讀不出來的。你只能用RsaProtectedConfigurationProvider和DataProtectionConfigurationProvider加密。
總結
以上是生活随笔為你收集整理的数据访问与sql语句的管理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天竺鼠为什么叫荷兰猪(天竺鼠和荷兰猪的区
- 下一篇: 关于MYsql 多字段排序