欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

程序员文章站 2023-11-14 09:24:22
在前面随笔《在代码生成工具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的扩展或者其他的扩展,稍作调整即可。

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

 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 即可。

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

 

2、框架应用的数据库配置项设置

完成上面的步骤,我们就可以在配置文件中增加配置信息如下所示,它就能正常的解析并处理了。

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

 

 上面使用了两种方式,一种是官方扩展的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>

这样我们底层就可以实现多种数据库的兼容访问了。

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

采用不同的数据库,我们需要为不同数据库的访问层进行生成处理,如为sqlserver数据的表生成相关的数据访问层dalsql,里面放置各个表对象的内容,不过由于采用了相关的继承类处理和基于数据库的代码生成,需要调整的代码很少。

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

我们来编写一段简单的程序代码来测试支持这种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];   
    }
}

测试界面效果如下所示。

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

以上这些处理,可以适用于web框架、bootstrap开发框架、winform开发框架、混合式开发框架中的应用,也就是cs、bs都可以使用。