基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
在前面随笔《在代码生成工具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都可以使用。