ADO.NET通用数据库操作类

最近经常看到一些人在秀其多年来积累经验而成的数据库操作类,在此我也秀一把。

本人对ORM相关的东西是极不喜欢的,可能与平常接触到的项目所操作的数据量都较大、业务较复杂吧。另对那种通过自己编写实体类,将数据取出后进行手动或自动代码转换成相应实体类,再放进一个LIST<T>,或一个具有数据修改通知的类OBSERVERLIST<t>中的行为也感到不解,为什么不用DATASET?不习惯动态的DATASET,也可以用类型化DATASET呀......

这是接口抽象类,另有ORACLE/SYBASE/SQLSERVER/ACCESS等几个数据库对应的实现子类,还有一个工厂类,可用于三层开发时,在remoting客户端进行实例化

下载地址点击打开链接

using System;
using System.Data;

/// <summary>
/// DynamicUpdate 的摘要说明
/// 
/// 非线程安全类
/// </summary>
namespace DynamicUpdate
{
    public abstract class DynamicUpdate : MarshalByRefObject
    {
        public static string ConnStr = "";

        public DynamicUpdate()
        {
        }

        public enum DataBaseType { Sybase, SQLServer, Access, Oralce };
        public static DynamicUpdate CreateInstance(DataBaseType dbt)
        {
            DynamicUpdate du = null;
            switch (dbt)
            {
                case DataBaseType.Sybase:
                    du = new DynamicUpdateSybase();
                    break;
                case DataBaseType.SQLServer:
                    du = new DynamicUpdateSQLServer();
                    break;
                case DataBaseType.Access:
                    du = new DynamicUpdateAccess();
                    break;
                case DataBaseType.Oralce:
                    du = new DynamicUpdateOracle();
                    break;
            }
            return du;
        }
        public static DynamicUpdate CreateInstance(DataBaseType dbt, string connstr)
        {
            DynamicUpdate du = null;
            switch (dbt)
            {
                case DataBaseType.Sybase:
                    du = new DynamicUpdateSybase(connstr);
                    break;
                case DataBaseType.SQLServer:
                    du = new DynamicUpdateSQLServer(connstr);
                    break;
                case DataBaseType.Access:
                    du = new DynamicUpdateAccess(connstr);
                    break;
                case DataBaseType.Oralce:
                    du = new DynamicUpdateOracle(connstr);
                    break;
            }
            return du;
        }
        public static DynamicUpdate CreateInstance(string connstr)
        {
            DynamicUpdate du = null;
            if (connstr.IndexOf("Oracle",StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                du = CreateInstance(DataBaseType.Oralce, connstr);
            }
            else if (connstr.IndexOf("Sybase", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                du = CreateInstance(DataBaseType.Sybase, connstr);
            }
            else if (connstr.IndexOf("SQLOLEDB", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                du = CreateInstance(DataBaseType.SQLServer, connstr);
            }
            else if (connstr.IndexOf("Microsoft.Jet.OLEDB", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                du = CreateInstance(DataBaseType.Access, connstr);
            }
            return du;
        }

        // 分页信息
        public int MaxRecordes = -1;
        public int PageIndex = 0;
        public int RecordCount = 0; // 当分页信息有用时,该值为总记录数,仅单个SQL GetData时有效

        abstract public System.Data.DataSet GetData(string MappingTable, string SQL);
        abstract public System.Data.DataSet GetData(string MappingTable, string SQL, object[] ParaValue);
        abstract public System.Data.DataSet GetData(string MappingTable, string SQL, System.Data.OleDb.OleDbType[] ParaType, object[] ParaValue);

        // 取得多个数据集,MappingTables和SQLs必须一一对应
        abstract public System.Data.DataSet GetDatas(string[] MappingTables, string[] SQLs);
        abstract public System.Data.DataSet GetDatas(string[] MappingTables, string[] SQLs, object[][] ParaValues);
        abstract public System.Data.DataSet GetDatas(string[] MappingTables, string[] SQLs, System.Data.OleDb.OleDbType[][] ParaTypes, object[][] ParaValues);

        // 执行SQL语句
        abstract public int ExecSQL(string SQL);
        abstract public int ExecSQL(string SQL, object[] ParaValue);
        abstract public int ExecSQL(string SQL, System.Data.OleDb.OleDbType[] ParaType, object[] ParaValue);
        abstract public int[] ExecSQL(string[] SQL);
        abstract public int[] ExecSQL(string[] SQL, object[][] ParaValues);
        abstract public int[] ExecSQL(string[] SQL, System.Data.OleDb.OleDbType[][] ParaTypes, object[][] ParaValues);

        // 动态更新函数, 根据DataTable内的字段动态构造更新语句, 返回更新后的DataTable
        abstract public System.Data.DataTable Update(System.Data.DataTable xdt, string SourceTable);

        abstract public System.Data.DataSet Update(System.Data.DataSet xds, string MappingTable, string SourceTable);

        // 同时更新多个数据集
        abstract public System.Data.DataSet Updates(System.Data.DataSet xds, string[] MappingTables, string[] SourceTables);

        // 生成取总记录数SQL
        virtual public string GenCountSQL(string sql)
        {
            return "select count(*) as RecordCount from ("+sql+") as tmp_table";
        }

        /// <summary>
        /// 返回一个OleDbDataReader,该系列函数仅能用在服务端,使用参数CommandBehavior.CloseConnection打开,记得使用后一定要关闭OleDbDataReader
        /// </summary>
        /// <param name="SQL"></param>
        /// <returns></returns>
        abstract public System.Data.OleDb.OleDbDataReader ExecuteReader(string SQL);
        abstract public System.Data.OleDb.OleDbDataReader ExecuteReader(string SQL, object[] ParaValue);
        abstract public System.Data.OleDb.OleDbDataReader ExecuteReader(string SQL, System.Data.OleDb.OleDbType[] ParaType, object[] ParaValue);

        /// <summary>
        /// 返回当前Connection,该系列函数仅能用在服务端,记得使用后一定要关闭Connection
        /// </summary>
        /// <returns></returns>
        abstract public System.Data.OleDb.OleDbConnection GetConnection();

        /// <summary>
        /// 返回指定AType对应的OleDbType
        /// </summary>
        /// <param name="AType"></param>
        /// <returns></returns>
        abstract public System.Data.OleDb.OleDbType GetOleDbType(Type AType);
    }
}


展开阅读全文

没有更多推荐了,返回首页