在前面隨筆《在代碼生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)訪問Oracle資料庫,實現免安裝Oracle客戶端,相容32位64位Oracle驅動》中介紹了在代碼生成工具中使用ODP.NET(Oracle.ManagedDat... ...
在前面隨筆《在代碼生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)訪問Oracle資料庫,實現免安裝Oracle客戶端,相容32位64位Oracle驅動》中介紹了在代碼生成工具中使用ODP.NET(Oracle.ManagedDataAccess.dll)訪問Oracle資料庫,如果我們在框架應用中需要使用這個如何處理了?由於我們開發框架底層主要使用微軟企業庫(目前用的版本是4.1),如果是使用它官方的Oracle擴展,那麼就是使用EntLibContrib.Data.OdpNet(這個企業庫擴展類庫使用了Oracle.DataAccess.dll),不過這種方式還是受限於32位和64位的問題;假如我們使用ODP.NET(Oracle.ManagedDataAccess.dll)方式,可以使用自己擴展企業庫支持即可,類似於我們支持國產資料庫--達夢資料庫一樣的原理,使用Oracle.ManagedDataAccess類庫可以避免32位和64位衝突問題,實現統一相容。
1、擴展支持ODP.NET(Oracle.ManagedDataAccess.dll)訪問
為了實現自定義的擴展支持,我們需要對企業庫的擴展類庫進行處理,類似我們之前編寫達夢資料庫的自定義擴展類庫一樣,這方面可以瞭解下之前的隨筆《基於Enterprise Library的Winform開發框架實現支持國產達夢資料庫的擴展操作》,我們現在增加對ODP.NET(Oracle.ManagedDataAccess.dll)方式的擴展支持。
首先我們創建一個項目,並通過Nugget的方式獲得對應的Oracle.ManagedDataAccess.dll類庫,參考企業庫對於Mysql的擴展或者其他的擴展,稍作調整即可。
OracleDatabase類似下麵代碼
using System; using System.Data; using System.Data.Common; using Microsoft.Practices.EnterpriseLibrary.Common; using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Data.Configuration; using Oracle.ManagedDataAccess.Client; namespace EntLibContrib.Data.OracleManaged { /// <summary> /// <para>Oracle資料庫對象(使用ODP驅動)</para> /// </summary> /// <remarks> /// <para> /// Internally uses OracleProvider from Oracle to connect to the database. /// </para> /// </remarks> [DatabaseAssembler(typeof(OracleDatabaseAssembler))] public class OracleDatabase : Database { /// <summary> /// Initializes a new instance of the <see cref="OracleDatabase"/> class /// with a connection string. /// </summary> /// <param name="connectionString">The connection string.</param> public OracleDatabase(string connectionString) : base(connectionString, OracleClientFactory.Instance) { } /// <summary> /// <para> /// Gets the parameter token used to delimit parameters for the /// Oracle database.</para> /// </summary> /// <value> /// <para>The '?' symbol.</para> /// </value> protected char ParameterToken { get { return ':'; } } .........
主要就是把對應的類型修改為Oracle的即可,如Oracle的名稱,以及參數的符號為 :等地方,其他的一一調整即可,不在贅述。
完成後,修改程式集名稱,編譯為 EntLibContrib.Data.OracleManaged.dll 即可。
2、框架應用的資料庫配置項設置
完成上面的步驟,我們就可以在配置文件中增加配置信息如下所示,它就能正常的解析並處理了。
上面使用了兩種方式,一種是官方擴展的EntLibContrib.Data.OdpNet方式,一種是我們這裡剛剛出爐的 EntLibContrib.Data.OracleManaged方式,完整的資料庫支持文件信息如下所示。
<?xml version="1.0"?> <configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/> <section name="oracleConnectionSettings" type="EntLibContrib.Data.OdpNet.Configuration.OracleConnectionSettings, EntLibContrib.Data.OdpNet" /> </configSections> <connectionStrings> <!--SQLServer資料庫的連接字元串--> <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI"/> <!--Oracle資料庫的連接字元串--> <add name="oracle" providerName="System.Data.OracleClient" connectionString="Data Source=orcl;User ID=whc;Password=whc"/> <!--MySQL資料庫的連接字元串--> <add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=WinFramework;Uid=root;Pwd=123456;"/> <!--PostgreSQL資料庫的連接字元串--> <add name="npgsql" providerName="Npgsql" connectionString="Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=123456"/> <!--路徑符號|DataDirectory|代表當前運行目錄--> <!--SQLite資料庫的連接字元串--> <add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WinFramework.db;Version=3;" /> <!--Microsoft Access資料庫的連接字元串--> <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=;" /> <!--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;" /> <add name="oracle3" providerName="OracleManaged" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl.mshome.net)));User ID=win;Password=win" /> </connectionStrings> <dataConfiguration defaultDatabase="oracle3"> <providerMappings> <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.PostgreSql.NpgsqlDatabase, EntLibContrib.Data.PostgreSql" name="Npgsql" /> <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" /> <add databaseType="EntLibContrib.Data.Dm.DmDatabase, EntLibContrib.Data.Dm" name="Dm" /> <!--增加ODP.NET(Oracle.ManagedDataAccess.dll)方式的擴展支持--> <add databaseType="EntLibContrib.Data.OracleManaged.OracleDatabase, EntLibContrib.Data.OracleManaged" name="OracleManaged" /> </providerMappings> </dataConfiguration> <appSettings> </appSettings> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> <supportedRuntime version="v2.0.50727"/> </startup> </configuration>
這樣我們底層就可以實現多種資料庫的相容訪問了。
採用不同的資料庫,我們需要為不同資料庫的訪問層進行生成處理,如為SQLServer數據的表生成相關的數據訪問層DALSQL,裡面放置各個表對象的內容,不過由於採用了相關的繼承類處理和基於資料庫的代碼生成,需要調整的代碼很少。
我們來編寫一段簡單的程式代碼來測試支持這種ODP.net方式,測試代碼如下所示。
private void btnGetData_Click(object sender, EventArgs e) { string sql = "select * from T_Customer";// + " Where Name = :name"; Database db = DatabaseFactory.CreateDatabase(); DbCommand command = db.GetSqlStringCommand(sql); //command.Parameters.Add(new OracleParameter("name", "張三")); using (var ds = db.ExecuteDataSet(command)) { this.dataGridView1.DataSource = ds.Tables[0]; } }
測試界面效果如下所示。
以上這些處理,可以適用於Web框架、Bootstrap開發框架、Winform開發框架、混合式開發框架中的應用,也就是CS、BS都可以使用。