轉(zhuǎn)帖|使用教程|編輯:龔雪|2022-12-16 10:23:05.327|閱讀 183 次
概述:本文主要為大家介紹如何在進(jìn)行WinForm應(yīng)用開(kāi)發(fā)時(shí)如何配置數(shù)據(jù)庫(kù),歡迎下載相關(guān)組件體驗(yàn)~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
相關(guān)鏈接:
在Winform開(kāi)發(fā)框架系列中,底層數(shù)據(jù)庫(kù)的配置處理都是差不多的,框架整體支持SQLServer、DB2、MySql、ODP.NET(Oracle)、PostgreSQL、SQLite、SqlEx等數(shù)據(jù)庫(kù)的,往往客戶在使用框架的時(shí)候會(huì)問(wèn),框架支持哪些數(shù)據(jù)庫(kù)、各種數(shù)據(jù)庫(kù)配置信息、如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)分庫(kù)處理、如何同時(shí)支持SQLServer和Oracle等數(shù)據(jù)庫(kù)支持、如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接字符串加密等問(wèn)題,本篇隨筆逐一進(jìn)行介紹。
PS:給大家推薦這個(gè)WinForm應(yīng)用界面開(kāi)發(fā)組件——DevExpress WinForms,它能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無(wú)論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
DevExpress技術(shù)交流群6:600715373 歡迎一起進(jìn)群討論
框架底層數(shù)據(jù)庫(kù)訪問(wèn)采用了微軟企業(yè)庫(kù)實(shí)現(xiàn),因此在處理多種數(shù)據(jù)庫(kù)訪問(wèn)的時(shí)候,能夠提供統(tǒng)一的訪問(wèn)處理操作,同時(shí)對(duì)不同的數(shù)據(jù)庫(kù)支持操作也是非常不錯(cuò)的。下圖是框架底層數(shù)據(jù)庫(kù)的支持情況。
采用了微軟企業(yè)庫(kù)Enterprise Library作為我們底層的數(shù)據(jù)庫(kù)訪問(wèn)模塊后,對(duì)于多種數(shù)據(jù)庫(kù)的訪問(wèn)操作,就會(huì)統(tǒng)一采用這個(gè)企業(yè)庫(kù)的數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象,操作起來(lái)非常一致,為了對(duì)不同數(shù)據(jù)庫(kù)的常規(guī)增刪改查等一些操作進(jìn)行進(jìn)一步的封裝,以達(dá)到簡(jiǎn)化代碼的目的,因此我們可以為每個(gè)不同的數(shù)據(jù)庫(kù)定義一個(gè)數(shù)據(jù)訪問(wèn)操作基類,以便實(shí)現(xiàn)一些不同數(shù)據(jù)庫(kù)差異性的處理,但是它們還是有一個(gè)共同的數(shù)據(jù)訪問(wèn)基類。
采用不同的數(shù)據(jù)庫(kù),我們需要為不同數(shù)據(jù)庫(kù)的訪問(wèn)層進(jìn)行生成處理,如為SQLServer數(shù)據(jù)的表生成相關(guān)的數(shù)據(jù)訪問(wèn)層DALSQL,里面放置各個(gè)表對(duì)象的內(nèi)容,不過(guò)由于采用了相關(guān)的繼承類處理和基于數(shù)據(jù)庫(kù)的代碼生成,需要調(diào)整的代碼很少。
這樣整合多種數(shù)據(jù)庫(kù)支持的底層后,整個(gè)數(shù)據(jù)訪問(wèn)的架構(gòu)設(shè)計(jì)如下所示。
對(duì)于默認(rèn)支持的SQLServer數(shù)據(jù)庫(kù),它的連接字符串如下所示。
<?xml version="1.0"?> <configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/> </configSections> <connectionStrings> <!--SQLServer數(shù)據(jù)庫(kù)的連接字符串--> <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI"/> </connectionStrings> <dataConfiguration defaultDatabase="sqlserver"> </dataConfiguration> </configuration>
上面的sqlserver數(shù)據(jù)庫(kù)連接信息是采用信任模式配置的,如果我們基于局域網(wǎng),那么需要配置對(duì)應(yīng)的IP或者sa用戶名和密碼的方式,配置信息如下所示。
<add name="sqlserver2" providerName="System.Data.SqlClient" connectionString="Data Source=192.168.1.10;Initial Catalog=CRM;Persist Security Info=True;User ID=sa;Password=123456"/>
不過(guò)對(duì)于一些擴(kuò)展支持的數(shù)據(jù)庫(kù),我們還需要添加一些映射處理,如對(duì)于MySQL的支持,我們需要添加連接字符串:
<!--MySQL數(shù)據(jù)庫(kù)的連接字符串--> <add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=WinFramework;Uid=root;Pwd=123456;"/>
還需要添加ProviderMappings的支持,如下所示的XML。
<dataConfiguration defaultDatabase="mysql"> <providerMappings> <add databaseType="EntLibContrib.Data.MySql.MySqlDatabase, EntLibContrib.Data.MySql" name="MySql.Data.MySqlClient" /> </providerMappings> </dataConfiguration>
下面我列出所有不同數(shù)據(jù)庫(kù)的連接字符串以及映射關(guān)系的一個(gè)完整版本,供參考。
<?xml version="1.0"?> <configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/> </configSections> <connectionStrings> <!--Sqlserver數(shù)據(jù)庫(kù)的連接字符串--> <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI"/> <!--PostgreSQL數(shù)據(jù)庫(kù)的連接字符串--> <add name="npgsql" providerName="Npgsql" connectionString="Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=123456"/> <!--MySQL數(shù)據(jù)庫(kù)的連接字符串--> <add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=WinFramework;Uid=root;Pwd=root;"/> <!--路徑符號(hào)|DataDirectory|代表當(dāng)前運(yùn)行目錄--> <add name="access" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\WinFramework.mdb;User ID=Admin;Jet OLEDB:Database Password=;" /> <!--sqlite數(shù)據(jù)庫(kù)字符串,路徑符號(hào)|DataDirectory|代表當(dāng)前運(yùn)行目錄--> <add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WinFramework.db;Version=3;" /> <!--Oracle數(shù)據(jù)庫(kù)的連接字符串--> <add name="oracle" providerName="System.Data.OracleClient" connectionString="Data Source=orcl;User ID=win;Password=win"/> <!--達(dá)夢(mèng)數(shù)據(jù)庫(kù)的連接字符串--> <add name="Dm" providerName="Dm" connectionString="Server=localhost;User ID=SYSDBA;PWD=SYSDBA;Database=WINFRAMEWORK;" /> <!--IBM DB2數(shù)據(jù)庫(kù)的連接字符串--> <add name="db2" providerName="IBM.Data.DB2" connectionString="database=whc;uid=whc;pwd=123456"/> <!--采用OdpNet方式的Oracle數(shù)據(jù)庫(kù)的連接字符串--> <add name="oracle2" providerName="Oracle.DataAccess.Client" connectionString="Data Source=orcl;User id=win;Password=win;" /> </connectionStrings> <dataConfiguration defaultDatabase="sqlserver"> <providerMappings> <add databaseType="EntLibContrib.Data.PostgreSql.NpgsqlDatabase, EntLibContrib.Data.PostgreSql" name="Npgsql" /> <add databaseType="EntLibContrib.Data.MySql.MySqlDatabase, EntLibContrib.Data.MySql" name="MySql.Data.MySqlClient" /> <add databaseType="EntLibContrib.Data.SQLite.SQLiteDatabase, EntLibContrib.Data.SqLite" name="System.Data.SQLite" /> <add databaseType="EntLibContrib.Data.Dm.DmDatabase, EntLibContrib.Data.Dm" name="Dm" /> <add databaseType="EntLibContrib.Data.DB2.DB2Database, EntLibContrib.Data.DB2" name="IBM.Data.DB2" /> <add databaseType="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet" name="Oracle.DataAccess.Client" /> </providerMappings> </dataConfiguration> <appSettings> <!--組件的數(shù)據(jù)庫(kù)類型:access、sqlserver、sqlite、oracle等,默認(rèn)為sqlserver可不寫(xiě)--> <add key="ComponentDbType" value="sqlserver"/> </appSettings> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> <supportedRuntime version="v2.0.50727"/> </startup> </configuration>
里面包括了支持的各種數(shù)據(jù)庫(kù)的連接字符串的寫(xiě)法。
由于整個(gè)框架的設(shè)計(jì)抽象了多種數(shù)據(jù)庫(kù)的處理模型,因此數(shù)據(jù)庫(kù)分庫(kù)處理實(shí)現(xiàn)也是比較方便的,數(shù)據(jù)庫(kù)的分庫(kù)處理和同時(shí)支持SQLServer和Oracle等數(shù)據(jù)庫(kù)的操作是類似的,他們都是對(duì)多個(gè)數(shù)據(jù)庫(kù)(包括不同各類型)進(jìn)行訪問(wèn)處理。
之前我在隨筆《》這里也介紹了具體的實(shí)現(xiàn)處理,其實(shí)我們使用的同時(shí)支持多數(shù)據(jù)庫(kù)的操作代碼是比較簡(jiǎn)單的,我們可以在代碼里面通過(guò)調(diào)用BLL層類的接口SetConfitName來(lái)指定特定的數(shù)據(jù)庫(kù),如下代碼所示。
//指定業(yè)務(wù)類的數(shù)據(jù)庫(kù)配置 BLLFactory<Asset>.Instance.SetConfigName("workflow"); BLLFactory<StoreAddress>.Instance.SetConfigName("workflow");
有時(shí)候,可能BLL對(duì)象有可能出現(xiàn)相同的情況,但是需要訪問(wèn)不同庫(kù)里面的表對(duì)象,那么我們可以在使用后恢復(fù)默認(rèn)的配置信息。
BLLFactory<DictData>.Instance.SetConfigName("workflow");//使用業(yè)務(wù)庫(kù) Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName); BLLFactory<DictData>.Instance.SetConfigName(null);//恢復(fù)默認(rèn)
以上代碼就是先訪問(wèn)workflow配置的數(shù)據(jù)庫(kù)信息,獲取字典信息后恢復(fù)默認(rèn)的數(shù)據(jù)庫(kù)信息。
上面那種方式是對(duì)于同種類型數(shù)據(jù)庫(kù)的接口切換,如果不同的數(shù)據(jù)庫(kù)類型,如一個(gè)是SQLServer,一個(gè)是Oracle,那么就可以多指定一個(gè)參數(shù)即可,如下代碼所示。
//指定使用oracle類型的數(shù)據(jù)庫(kù)配置 BLLFactory<DictData>.Instance.SetConfigName("workflow", "oracle");//使用業(yè)務(wù)庫(kù) Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName); BLLFactory<DictData>.Instance.SetConfigName(null);//恢復(fù)默認(rèn)
雖然我們一般使用一個(gè)庫(kù),但是如果是分庫(kù),或者要同時(shí)支持多個(gè)數(shù)據(jù)庫(kù)類型,基本上處理還是很方便的。
如果對(duì)于通用類型的數(shù)據(jù)庫(kù)處理,我們可以使用公用類庫(kù)里面的CommonDAL類進(jìn)行處理。這個(gè)類庫(kù)可以很方便的處理視圖、存儲(chǔ)過(guò)程、或者常規(guī)的接口查詢操作,不需要和具體的實(shí)體類綁定的接口。
它的定義如下所示。
很多情況下,我們?yōu)榱瞬渴饝?yīng)用,需要公開(kāi)數(shù)據(jù)庫(kù)連接字符串信息,但是我們又不想讓使用者很容易的獲取到我們的連接字符串里面的用戶名和密碼敏感信息,這時(shí)候連接字符串加密就是比較必要的了。
處理方式就是我們創(chuàng)建一個(gè)工具,使用自己知道的加解密規(guī)則來(lái)處理連接字符串的加解密處理。
處理的過(guò)程大概如下所示。
<add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=CRM;Integrated Security=SSPI"/>
<add name="sqlserver" providerName="System.Data.SqlClient" connectionString="9Fs/vPhm24CYa0mXCLAMYOJmbBHq/qQAjdbVdbeOhS5L0d8WGhHUR3iIyFZydEV8cPmlPHfDTnwJZMr9xkMAxuNtPKUsIdKTjlWInpf+Vc+UD2gtYIE3FnvL06KcHzX+"/>
這個(gè)配置信息在框架的處理的時(shí)候有對(duì)應(yīng)的解密處理規(guī)則,可以正常解析加密字符串即可。
如果要了解或者修改其中的對(duì)應(yīng)解密處理操作,可以定位擴(kuò)展公用類庫(kù)里面數(shù)據(jù)庫(kù)訪問(wèn)層,如下所示。
定位到對(duì)應(yīng)的數(shù)據(jù)庫(kù)訪問(wèn)類,然后找到下面的對(duì)應(yīng)函數(shù)了解即可。
本文轉(zhuǎn)載自:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: