天天看點

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

作者:慧都科技

在Winform開發架構系列中,底層資料庫的配置處理都是差不多的,架構整體支援SQLServer、DB2、MySql、ODP.NET(Oracle)、PostgreSQL、SQLite、SqlEx等資料庫的,往往客戶在使用架構的時候會問,架構支援哪些資料庫、各種資料庫配置資訊、如何實作資料庫分庫處理、如何同時支援SQLServer和Oracle等資料庫支援、如何實作資料庫連接配接字元串加密等問題,本篇随筆逐一進行介紹。

PS:給大家推薦這個WinForm應用界面開發元件——DevExpress WinForms,它能完美建構流暢、美觀且易于使用的應用程式,無論是Office風格的界面,還是分析處理大批量的業務資料,它都能輕松勝任!

DevExpress WinForms Subscription官方最新版免費下載下傳試用,曆史版本下載下傳,線上文檔和幫助檔案下載下傳-慧都網

架構支援的資料庫介紹

架構底層資料庫通路采用了微軟企業庫實作,是以在處理多種資料庫通路的時候,能夠提供統一的通路處理操作,同時對不同的資料庫支援操作也是非常不錯的。下圖是架構底層資料庫的支援情況。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

采用了微軟企業庫Enterprise Library作為我們底層的資料庫通路子產品後,對于多種資料庫的通路操作,就會統一采用這個企業庫的資料庫通路對象,操作起來非常一緻,為了對不同資料庫的正常增删改查等一些操作進行進一步的封裝,以達到簡化代碼的目的,是以我們可以為每個不同的資料庫定義一個資料通路操作基類,以便實作一些不同資料庫差異性的處理,但是它們還是有一個共同的資料通路基類。

采用不同的資料庫,我們需要為不同資料庫的通路層進行生成處理,如為SQLServer資料的表生成相關的資料通路層DALSQL,裡面放置各個表對象的内容,不過由于采用了相關的繼承類處理和基于資料庫的代碼生成,需要調整的代碼很少。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

這樣整合多種資料庫支援的底層後,整個資料通路的架構設計如下所示。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

各種資料庫配置資訊

對于預設支援的SQLServer資料庫,它的連接配接字元串如下所示。

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/>
</configSections>
<connectionStrings>
<!--SQLServer資料庫的連接配接字元串-->
<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資料庫連接配接資訊是采用信任模式配置的,如果我們基于區域網路,那麼需要配置對應的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"/>           

不過對于一些擴充支援的資料庫,我們還需要添加一些映射處理,如對于MySQL的支援,我們需要添加連接配接字元串:

<!--MySQL資料庫的連接配接字元串-->
<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>           

下面我列出所有不同資料庫的連接配接字元串以及映射關系的一個完整版本,供參考。

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/>
</configSections>
<connectionStrings>
<!--Sqlserver資料庫的連接配接字元串-->
<add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI"/>

<!--PostgreSQL資料庫的連接配接字元串-->
<add name="npgsql" providerName="Npgsql" connectionString="Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=123456"/>
<!--MySQL資料庫的連接配接字元串-->
<add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=WinFramework;Uid=root;Pwd=root;"/>
<!--路徑符号|DataDirectory|代表目前運作目錄-->
<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資料庫字元串,路徑符号|DataDirectory|代表目前運作目錄-->
<add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WinFramework.db;Version=3;" />
<!--Oracle資料庫的連接配接字元串-->
<add name="oracle" providerName="System.Data.OracleClient" connectionString="Data Source=orcl;User ID=win;Password=win"/>
<!--達夢資料庫的連接配接字元串-->
<add name="Dm" providerName="Dm" connectionString="Server=localhost;User ID=SYSDBA;PWD=SYSDBA;Database=WINFRAMEWORK;" />
<!--IBM DB2資料庫的連接配接字元串-->
<add name="db2" providerName="IBM.Data.DB2" connectionString="database=whc;uid=whc;pwd=123456"/>
<!--采用OdpNet方式的Oracle資料庫的連接配接字元串-->
<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>
<!--元件的資料庫類型:access、sqlserver、sqlite、oracle等,預設為sqlserver可不寫-->
<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>           

裡面包括了支援的各種資料庫的連接配接字元串的寫法。

如何實作資料庫分庫處理、如何同時支援SQLServer和Oracle等資料庫支援

由于整個架構的設計抽象了多種資料庫的處理模型,是以資料庫分庫處理實作也是比較友善的,資料庫的分庫處理和同時支援SQLServer和Oracle等資料庫的操作是類似的,他們都是對多個資料庫(包括不同各類型)進行通路處理。

之前我在随筆《Winform開發架構中實作多種資料庫類型切換以及分拆資料庫的支援》這裡也介紹了具體的實作處理,其實我們使用的同時支援多資料庫的操作代碼是比較簡單的,我們可以在代碼裡面通過調用BLL層類的接口SetConfitName來指定特定的資料庫,如下代碼所示。

//指定業務類的資料庫配置
BLLFactory<Asset>.Instance.SetConfigName("workflow");
BLLFactory<StoreAddress>.Instance.SetConfigName("workflow");           

有時候,可能BLL對象有可能出現相同的情況,但是需要通路不同庫裡面的表對象,那麼我們可以在使用後恢複預設的配置資訊。

BLLFactory<DictData>.Instance.SetConfigName("workflow");//使用業務庫
Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
BLLFactory<DictData>.Instance.SetConfigName(null);//恢複預設           

以上代碼就是先通路workflow配置的資料庫資訊,擷取字典資訊後恢複預設的資料庫資訊。

上面那種方式是對于同種類型資料庫的接口切換,如果不同的資料庫類型,如一個是SQLServer,一個是Oracle,那麼就可以多指定一個參數即可,如下代碼所示。

//指定使用oracle類型的資料庫配置
BLLFactory<DictData>.Instance.SetConfigName("workflow", "oracle");//使用業務庫
Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
BLLFactory<DictData>.Instance.SetConfigName(null);//恢複預設           

雖然我們一般使用一個庫,但是如果是分庫,或者要同時支援多個資料庫類型,基本上處理還是很友善的。

如果對于通用類型的資料庫處理,我們可以使用公用類庫裡面的CommonDAL類進行處理。這個類庫可以很友善的處理視圖、存儲過程、或者正常的接口查詢操作,不需要和具體的實體類綁定的接口。

它的定義如下所示。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

資料庫字元串加密處理

很多情況下,我們為了部署應用,需要公開資料庫連接配接字元串資訊,但是我們又不想讓使用者很容易的擷取到我們的連接配接字元串裡面的使用者名和密碼敏感資訊,這時候連接配接字元串加密就是比較必要的了。

處理方式就是我們建立一個工具,使用自己知道的加解密規則來處理連接配接字元串的加解密處理。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

處理的過程大概如下所示。

  1. 找到app.config檔案,打開内容編輯。
  2. 找到資料庫(如SQLServer)連接配接字元串的connectionString字元串,如下所示。

    <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=CRM;Integrated Security=SSPI"/>

  3. 提取裡面的connectionString字元串部分,放到上面的加密軟體裡面進行加密,然後把加密内容替換connectionString字元串,變為如下所示的配置資訊。

    <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="9Fs/vPhm24CYa0mXCLAMYOJmbBHq/qQAjdbVdbeOhS5L0d8WGhHUR3iIyFZydEV8cPmlPHfDTnwJZMr9xkMAxuNtPKUsIdKTjlWInpf+Vc+UD2gtYIE3FnvL06KcHzX+"/>

  4. 儲存檔案,配置加密字元串完成。

這個配置資訊在架構的處理的時候有對應的解密處理規則,可以正常解析加密字元串即可。

如果要了解或者修改其中的對應解密處理操作,可以定位擴充公用類庫裡面資料庫通路層,如下所示。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

定位到對應的資料庫通路類,然後找到下面的對應函數了解即可。

WinForm應用實戰開發指南 - 資料庫配置的幾種場景

本文轉載自:部落格園 - 伍華聰

繼續閱讀