日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据访问与sql语句的管理(一)

發布時間:2024/9/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据访问与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语句的管理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。