zoukankan      html  css  js  c++  java
  • 采用泛型链接多类型数据库[含源码]

             最近在看vs2005上关于泛型的介绍,同时考虑到手头上使用的DBSERVICE库中文件过多(共7个CS文件),想利用泛型技术对它进行“瘦身”,最后系统只有2个文件。现把相关文件做一简单说明:

             说明:DbAccess.cs文件, InitailDB函数采用反射进行相关信息搜集      

     1 /// <summary>
     2        /// 初始化数据库信息
     3        /// </summary>
     4        /// <typeparam name="T"></typeparam>
     5        /// <param name="dai"></param>

     6        public static void InitailDB<T>(T dai)
     7        {
     8            Type type = dai.GetType();
     9            object[] args = null
    10            concreteDbConn = (IDbConnection)type.GetMethod("CreateConnection").Invoke(dai, args);
    11            concreteDbConn.ConnectionString = (string) type.GetMethod("GetConnectionString").Invoke(dai, args);
    12            concreteDbConn.Open();
    13            concreteDbCommand = (IDbCommand)type.GetMethod("CreateCommand").Invoke(dai, args);
    14            concreteDbTrans = (IDbTransaction)type.GetMethod("CreateTransaction").Invoke(dai, new object[] { concreteDbConn });
    15            concreteDbCommand.Connection = concreteDbConn;
    16            concreteDbCommand.Transaction = concreteDbTrans;
    17            concreteDbAdapter = (IDbDataAdapter)type.GetMethod("CreateDataAdapter").Invoke(dai, args);
    18        }

    19

           
       调用方法:CreateGenericInstance(),只要将相应的类型做为参数加入到InitailDB<T>中即可

        InitailDB<Generic_Access<SqlConnection, SqlCommand, SqlDataAdapter>>(
                                Generic_Access < SqlConnection, SqlCommand, SqlDataAdapter >.GetInstance());break;


        泛型类DB_Generic.cs代码如下 :   

     using System;
        
    using System.Data;
        
    using System.Configuration;
        
    using System.Collections.Generic;

     
    public sealed class Generic_Access<Connection, Command, DataAdapter>
            where Connection : 
    classnew()
            where Command : 
    classnew()
            where DataAdapter : 
    classnew()
         
        
    {

            
    public static volatile Generic_Access<Connection, Command, DataAdapter> singleFactory = null;

            
    private static object syncObj = new object();

            
    public static Generic_Access<Connection, Command, DataAdapter> GetInstance()
            
    {
                
    if (singleFactory == null)
                
    {
                    
    lock (syncObj)
                    
    {
                        
    if (singleFactory == null)
                        
    {
                            singleFactory 
    = new Generic_Access<Connection, Command, DataAdapter>();
                        }

                    }

                }

                
    return singleFactory;
            }



            
    private Generic_Access()
            
    {
            }



            
    public void Disponse()
            
    {
                singleFactory.Disponse();
            }

                 
            
    /// <summary>
            
    /// 建立默认Connection对象
            
    /// </summary>
            
    /// <returns>Connection对象</returns>

            public Connection CreateConnection()
            
    {
                
    return new Connection();
                  
            }


           
            
    /// <summary>
            
    /// 建立Command对象
            
    /// </summary>
            
    /// <returns>Command对象</returns>

            public Command CreateCommand()
            
    {
                 
    return new Command();
            }



            
    /// <summary>
            
    /// 建立DataAdapter对象
            
    /// </summary>
            
    /// <returns>DataAdapter对象</returns>

            public DataAdapter CreateDataAdapter()
            
    {
                  
    return new DataAdapter();
            }




            
    /// <summary>
            
    /// 根据Connection建立Transaction
            
    /// </summary>
            
    /// <param name="myDbConnection">Connection对象</param>
            
    /// <returns>Transaction对象</returns>

            public IDbTransaction CreateTransaction(IDbConnection myDbConnection)
            
    {
                
    return myDbConnection.BeginTransaction();
            }



            
    /// <summary>
            
    /// 根据Command建立DataReader
            
    /// </summary>
            
    /// <param name="myDbCommand">Command对象</param>
            
    /// <returns>DataReader对象</returns>

            public IDataReader CreateDataReader(IDbCommand myDbCommand)
            
    {
                
    return myDbCommand.ExecuteReader();
            }

    .

    最后是测试代码:using DB_Generic; 

     1public partial class DB_Generic_Default : System.Web.UI.Page
     2  {
     3    protected void Page_Load(object sender, EventArgs e)
     4    {
     5        if (!Page.IsPostBack)
     6        {
     7           
     8            Response.Write(DbAccess.SelectMaxID("users""ID"+ "<BR>");
     9
    10            string sql = "Select top 10 * From users Order By id asc";
    11            Repeater1.DataSource = DbAccess.SelectAllSqlString(sql).Tables[0].DefaultView;
    12            Repeater1.DataBind();
    13
    14

    .....

    详情见 源代码

         谢谢大家!

         如须转载,请注明出处。

  • 相关阅读:
    国内DP厂家的相关资料信息
    【转】挟天子以令诸侯博客关于TCP/IP模型与OSI模型的区别
    TMS320CC657基本外围电路调试
    TMS320C6657双核DSP的图像处理系统开发(1):硬件相关tips
    TI c6657开发资源
    PCIE接口的说明
    Flash Builder4注册机
    myeclipse 方法上加上@Override就报错的处理方法
    oracle安装完成后目录中不论有没有tnsnames.ora和listener.ora文件 PLSQL都能连上的问题解决方法
    POJO和javabean的区别
  • 原文地址:https://www.cnblogs.com/daizhj/p/GenericDbService.html
Copyright © 2011-2022 走看看