C#使用ado.net打造多数据库通用操作类

1. 创建数据库类型枚举

public enum DbProviderType : byte
{
    // <summary>
    /// 微软 SqlServer 数据库
    /// </summary>
    SqlServer,

    /// <summary>
    /// 开源 MySql数据库
    /// </summary>
    MySql,

    /// <summary>
    /// 嵌入式轻型数据库 SQLite
    /// </summary>
    SQLite,

    /// <summary>
    /// 甲骨文 Oracle
    /// </summary>
    Oracle,

    /// <summary>
    /// 开放数据库互连
    /// </summary>
    ODBC,

    /// <summary>
    /// 面向不同的数据源的低级应用程序接口
    /// </summary>
    OleDb,

    /// <summary>
    /// 跨平台的关系数据库系统 Firebird
    /// </summary>
    Firebird,

    /// <summary>
    ///加州大学伯克利分校计算机系开发的关系型数据库 PostgreSql
    /// </summary>
    PostgreSql,

    /// <summary>
    /// IBM出口的一系列关系型数据库管理系统 DB2
    /// </summary>
    DB2,

    /// <summary>
    /// IBM公司出品的关系数据库管理系统(RDBMS)家族  Informix
    /// </summary>
    Informix,

    /// <summary>
    /// 微软推出的一个适用于嵌入到移动应用的精简数据库产品 SqlServerCe
    /// </summary>
    SqlServerCe
}

2. 创建DbHelper类

public class DbHelper : IDisposable, IDatabase
{
    public DbProviderType dbType { get; set; }
    private DbProviderFactory providerFactory;
    private string connectionString = null; //保存连接字符串
    private DbConnection dbConnection;
    private DbTransaction dbTransaction;

    /// <summary>
    /// 生成DbProviderFactory对象
    /// </summary>
    /// <param name="connectionString">连接字符串</param>
    /// <param name="providerType">需要生成的DbProviderFactory对象</param>
    public DbHelper(string connectionString, DbProviderType providerType)
    {
        if (string.IsNullOrEmpty(connectionString)) //连接字符串不能为空
        {
            throw new ArgumentException("connectionString is not null");
        }
        providerFactory = ProviderFactory.GetDbProviderFactory(providerType);  //获取到生成的DbProviderFactory对象
        dbType = providerType;
        if (this.dbConnection == null)
        {
            this.connectionString = connectionString;
            this.dbConnection = GetDbConnection();
            if (this.dbConnection.State == ConnectionState.Closed)
            {
                this.dbConnection.Open();
            }
        }
        else if (this.dbConnection.State == ConnectionState.Closed)
        {
            this.dbConnection.Open();
        }
        if (providerFactory == null)
        {
            throw new ArgumentException("can't build DbProviderFactory, please check DbProviderType ");
        }
    }
    /// <summary>
    ///
    /// </summary>
    /// <returns></returns>
    public DbConnection GetDbConnection()
    {
        var dbConnection = providerFactory.CreateConnection();
        dbConnection.ConnectionString = connectionString;
        return dbConnection;
    }
    public DbCommand CreateDbCommand(DbConnection dbConnection, string SQLString, CommandType commandType)
    {
        DbCommand command = providerFactory.CreateCommand();
        command.CommandText = SQLString;
        command.CommandType = commandType;
        command.Connection = dbConnection;
        return command;
    }
    public DbDataAdapter CreateDbDataAdapter(DbConnection dbConnection, string SQLString)
    {
        DbDataAdapter dataAdapter = providerFactory.CreateDataAdapter();
        dataAdapter.SelectCommand = CreateDbCommand(dbConnection, SQLString, CommandType.Text);
        return dataAdapter;
    }
    public DbDataAdapter CreateDbDataAdapter(DbCommand dbCommand)
    {
        DbDataAdapter dataAdapter = providerFactory.CreateDataAdapter();
        dataAdapter.SelectCommand = dbCommand;
        return dataAdapter;
    }
    #region 公用方法
    public bool Exists(string strSql)
    {
        object obj = GetSingle(strSql);
        int cmdresult;
        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
        {
            cmdresult = 0;
        }
        else
        {
            cmdresult = int.Parse(obj.ToString());
        }
        if (cmdresult == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public bool Exists(string strSql, params DbParameter[] cmdParms)
    {
        object obj = GetSingle(strSql, cmdParms);
        int cmdresult;
        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
        {
            cmdresult = 0;
        }
        else
        {
            cmdresult = int.Parse(obj.ToString());
        }
        if (cmdresult == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    #endregion

    #region  执行简单SQL语句

    /// <summary>
    /// 执行SQL语句,返回影响的记录数
    /// </summary>
    /// <param name="SQLString">SQL语句</param>
    /// <returns>影响的记录数</returns>
    public int ExecuteSql(string SQLString)
    {
        using (DbCommand cmd = providerFactory.CreateCommand())
        {
            try
            {
                PrepareCommand(cmd, dbConnection, this.dbTransaction, SQLString, null);
                cmd.CommandTimeout = 5000;//500秒,单位是秒
                int rows = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return rows;
            }
            catch (DbException E)
            {
                throw new Exception(E.Message);
            }
            finally
            {
                //dbConnection.Close();
                //dbConnection.Dispose();
            }
        }
    }

    /// <summary>
    /// 执行一条计算查询结果语句,返回查询结果(object)。
    /// </summary>
    /// <param name="SQLString">计算查询结果语句</param>
    /// <returns>查询结果(object)</returns>
    public object GetSingle(string SQLString)
    {
        using (DbCommand cmd = CreateDbCommand(dbConnection, SQLString, CommandType.Text))
        {
            try
            {
                if (dbConnection.State == ConnectionState.Closed)
                    dbConnection.Open();
                object obj = cmd.ExecuteScalar();
                if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                {
                    return null;
                }
                else
                {
                    return obj;
                }
            }
            catch (DbException e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                dbConnection.Close();
                dbConnection.Dispose();
            }
        }
    }
    /// <summary>
    /// 执行查询语句,返回DbDataReader ( 注意:使用后一定要对DbDataReader进行Close )
    /// </summary>
    /// <param name="strSQL">查询语句</param>
    /// <returns>DbDataReader</returns>
    public DbDataReader ExecuteReader(string strSQL)
    {
        DbCommand cmd = CreateDbCommand(dbConnection, strSQL, CommandType.Text);
        try
        {
            if (dbConnection.State != ConnectionState.Open)
                dbConnection.Open();
            DbDataReader myReader = cmd.ExecuteReader();
            return myReader;
        }
        catch (DbException e)
        {
            dbConnection.Close();
            dbConnection.Dispose();
            throw new Exception(e.Message);
        }

    }
    /// <summary>
    /// 执行查询语句,返回DataSet
    /// </summary>
    /// <param name="SQLString">查询语句</param>
    /// <returns>DataSet</returns>
    public DataTable Query(string SQLString)
    {
        DataSet ds = new DataSet();
        try
        {
            //logger(SQLString, null);
            DbDataAdapter command = CreateDbDataAdapter(dbConnection, SQLString);
            //下面这句话一定要写,否则就会报如标题的问题
            if (this.dbTransaction != null)
            {
                command.SelectCommand.Transaction = this.dbTransaction;
            }

            command.Fill(ds, "ds");
        }
        catch (DbException ex)
        {
            throw new Exception(ex.Message);
        }

        return ds.Tables[0];
    }
    public DataTable Query(int startRecord, int maxRecords, string SQLString)
    {
        DataSet ds = new DataSet();
        try
        {
            if (dbConnection.State != ConnectionState.Open)
                dbConnection.Open();
            DbDataAdapter command = CreateDbDataAdapter(dbConnection, SQLString);
            command.Fill(ds, startRecord, maxRecords, "ds");
        }
        catch (DbException ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            dbConnection.Close();
            dbConnection.Dispose();
        }
        return ds.Tables[0];
    }
    public DataTable Query(string SQLString, int Times)
    {
        DataSet ds = new DataSet();
        try
        {
            if (dbConnection.State != ConnectionState.Open)
                dbConnection.Open();
            DbDataAdapter command = CreateDbDataAdapter(dbConnection, SQLString);
            command.SelectCommand.CommandTimeout = Times;
            command.Fill(ds, "ds");
        }
        catch (DbException ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            dbConnection.Close();
            dbConnection.Dispose();
        }
        return ds.Tables[0];
    }



    #endregion

    #region 执行带参数的SQL语句

    /// <summary>
    /// 执行SQL语句,返回影响的记录数
    /// </summary>
    /// <param name="SQLString">SQL语句</param>
    /// <returns>影响的记录数</returns>
    public int ExecuteSql(string SQLString, params DbParameter[] cmdParms)
    {
        using (DbCommand cmd = CreateDbCommand(dbConnection, SQLString, CommandType.Text))
        {
            try
            {
                //logger(SQLString, cmdParms);
                PrepareCommand(cmd, dbConnection, this.dbTransaction, SQLString, cmdParms);
                int rows = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return rows;
            }
            catch (DbException E)
            {
                throw new Exception(E.Message);
            }
            finally
            {
                //dbConnection.Close();
                //dbConnection.Dispose();
            }
        }
    }



    /// <summary>
    /// 执行一条计算查询结果语句,返回查询结果(object)。
    /// </summary>
    /// <param name="SQLString">计算查询结果语句</param>
    /// <returns>查询结果(object)</returns>
    public object GetSingle(string SQLString, params DbParameter[] cmdParms)
    {
        using (DbCommand cmd = providerFactory.CreateCommand())
        {
            try
            {
                PrepareCommand(cmd, dbConnection, null, SQLString, cmdParms);
                object obj = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                {
                    return null;
                }
                else
                {
                    return obj;
                }
            }
            catch (DbException e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                dbConnection.Close();
                dbConnection.Dispose();
            }
        }
    }
    /// <summary>
    /// 执行查询语句,返回DbDataReader ( 注意:使用后一定要对DbDataReader进行Close )
    /// </summary>
    /// <param name="strSQL">查询语句</param>
    /// <returns>DbDataReader</returns>
    public DbDataReader ExecuteReader(string SQLString, params DbParameter[] cmdParms)
    {
        DbCommand cmd = providerFactory.CreateCommand();
        try
        {
            PrepareCommand(cmd, dbConnection, null, SQLString, cmdParms);
            DbDataReader myReader = cmd.ExecuteReader();
            cmd.Parameters.Clear();
            return myReader;
        }
        catch (DbException e)
        {
            dbConnection.Close();
            dbConnection.Dispose();
            throw new Exception(e.Message);
        }
    }

    /// <summary>
    /// 执行查询语句,返回DataSet
    /// </summary>
    /// <param name="SQLString">查询语句</param>
    /// <returns>DataSet</returns>
    public DataTable Query(string SQLString, params DbParameter[] cmdParms)
    {
        DbCommand cmd = providerFactory.CreateCommand();
        PrepareCommand(cmd, dbConnection, (this.dbTransaction != null) ? this.dbTransaction : null, SQLString, cmdParms);
        using (DbDataAdapter da = CreateDbDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            try
            {
                da.SelectCommand.CommandType = CommandType.Text;
                //下面这句话一定要写,否则就会报如标题的问题
                //if (this.dbTransaction != null)
                //{
                //    da.SelectCommand.Transaction = this.dbTransaction;
                //}
                da.Fill(ds, "ds");
                cmd.Parameters.Clear();
            }
            catch (DbException ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                //dbConnection.Close();
                //dbConnection.Dispose();
            }
            return ds.Tables[0];
        }
    }
    public DataTable Query(int startRecord, int maxRecords, string SQLString, params DbParameter[] cmdParms)
    {
        DbCommand cmd = providerFactory.CreateCommand();
        PrepareCommand(cmd, dbConnection, null, SQLString, cmdParms);
        using (DbDataAdapter da = CreateDbDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            try
            {
                da.Fill(ds, startRecord, maxRecords, "ds");
                cmd.Parameters.Clear();
            }
            catch (DbException ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                dbConnection.Close();
                dbConnection.Dispose();
            }
            return ds.Tables[0];
        }
    }

    private void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, string cmdText, DbParameter[] cmdParms)
    {
        if (conn.State == ConnectionState.Closed)
            conn.Open();
        cmd.Connection = conn;
        cmd.CommandText = DbFactory.FormatSql(cmdText, this.dbType);
        if (trans != null)
            cmd.Transaction = trans;
        cmd.CommandType = CommandType.Text;//cmdType;            
        if (cmdParms != null)
        {
            cmdParms = DbFactory.FormatParameter(cmdParms, this.dbType);
            foreach (DbParameter parameter in cmdParms)
            {
                if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                    (parameter.Value == null))
                {
                    parameter.Value = DBNull.Value;
                }
                cmd.Parameters.Add(parameter);
            }
        }
    }

    #endregion

    #region 存储过程操作

    /// <summary>
    /// 执行存储过程 ( 注意:使用后一定要对DbDataReader进行Close )
    /// </summary>
    /// <param name="storedProcName">存储过程名</param>
    /// <param name="parameters">存储过程参数</param>
    /// <returns>DbDataReader</returns>
    public DbDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
    {
        DbDataReader returnReader;
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbCommand command = BuildQueryCommand(dbConnection, storedProcName, parameters);
        command.CommandTimeout = 5000;//500秒,单位是秒
        command.CommandType = CommandType.StoredProcedure;
        returnReader = command.ExecuteReader();
        return returnReader;
    }


    /// <summary>
    /// 执行存储过程
    /// </summary>
    /// <param name="storedProcName">存储过程名</param>
    /// <param name="parameters">存储过程参数</param>
    /// <param name="tableName">DataSet结果中的表名</param>
    /// <returns>DataSet</returns>
    public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
    {
        DataSet dataSet = new DataSet();
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbDataAdapter sqlDA = providerFactory.CreateDataAdapter();
        sqlDA.SelectCommand = BuildQueryCommand(dbConnection, storedProcName, parameters);
        sqlDA.SelectCommand.CommandTimeout = 5000;
        sqlDA.Fill(dataSet, tableName);
        dbConnection.Close();
        return dataSet;
    }

    /// <summary>
    /// 存储过程分页
    /// </summary>
    /// <param name="storedProcName"></param>
    /// <param name="parameters"></param>
    /// <param name="tableName"></param>
    /// <param name="Times"></param>
    /// <returns></returns>
    /// 

    public DataSet RunProcedurepage(string storedProcName, IDataParameter[] parameters, int fir, int end, string tableName)
    {
        DataSet dataSet = new DataSet();
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbDataAdapter sqlDA = providerFactory.CreateDataAdapter();
        sqlDA.SelectCommand = BuildQueryCommand(dbConnection, storedProcName, parameters);
        sqlDA.Fill(dataSet, fir, end, tableName);
        dbConnection.Close();
        return dataSet;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="storedProcName"></param>
    /// <param name="parameters"></param>
    /// <param name="tableName"></param>
    /// <param name="Times"></param>
    /// <returns></returns>



    public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName, int Times)
    {
        DataSet dataSet = new DataSet();
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbDataAdapter sqlDA = providerFactory.CreateDataAdapter();
        sqlDA.SelectCommand = BuildQueryCommand(dbConnection, storedProcName, parameters);
        sqlDA.SelectCommand.CommandTimeout = Times;
        sqlDA.Fill(dataSet, tableName);
        dbConnection.Close();
        return dataSet;
    }


    /// <summary>
    /// 构建 DbCommand 对象(用来返回一个结果集,而不是一个整数值)
    /// </summary>
    /// <param name="dbConnection">数据库连接</param>
    /// <param name="storedProcName">存储过程名</param>
    /// <param name="parameters">存储过程参数</param>
    /// <returns>DbCommand</returns>
    private void BuildQueryCommand(DbCommand cmd, DbConnection dbConnection, string storedProcName, IDataParameter[] parameters)
    {
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        cmd.Connection = dbConnection;
        cmd.CommandText = storedProcName;
        cmd.CommandType = CommandType.StoredProcedure;      //cmdType;
        if (parameters != null)
        {
            foreach (DbParameter parameter in parameters)
            {
                if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                    (parameter.Value == null))
                {
                    parameter.Value = DBNull.Value;
                }
                cmd.Parameters.Add(parameter);
            }
        }
    }
    private DbCommand BuildQueryCommand(DbConnection dbConnection, string storedProcName, IDataParameter[] parameters)
    {
        DbCommand command = CreateDbCommand(dbConnection, storedProcName, CommandType.StoredProcedure);
        if (parameters != null)
        {
            foreach (DbParameter parameter in parameters)
            {
                if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                    (parameter.Value == null))
                {
                    parameter.Value = DBNull.Value;
                }
                command.Parameters.Add(parameter);
            }
        }
        return command;
    }

    /// <summary>
    /// 执行存储过程,返回影响的行数		
    /// </summary>
    /// <param name="storedProcName">存储过程名</param>
    /// <param name="parameters">存储过程参数</param>
    /// <param name="rowsAffected">影响的行数</param>
    /// <returns></returns>
    public void RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
    {
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbCommand command = BuildQueryCommand(dbConnection, storedProcName, parameters);
        command.CommandTimeout = 5000;//500秒,单位是秒
        rowsAffected = command.ExecuteNonQuery();
        dbConnection.Close();
        dbConnection.Dispose();
    }
    public void RunProcedureNoReturn(string storedProcName, IDataParameter[] parameters)
    {
        int rowsAffected;
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbCommand command = BuildQueryCommand(dbConnection, storedProcName, parameters);
        rowsAffected = command.ExecuteNonQuery();
        dbConnection.Close();
        dbConnection.Dispose();
    }

    public void UpdateDateTable(DataTable dt)
    {
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();
        DbDataAdapter adapter = CreateDbDataAdapter(dbConnection, "select * from " + dt.TableName);
        DbCommandBuilder cb = providerFactory.CreateCommandBuilder();
        cb.DataAdapter = adapter;
        adapter.Update(dt);
    }

    public void UpdateDateTable(DbTransaction trans, DataTable dt)
    {
        DbCommand selectCommand = CreateDbCommand(trans.Connection, "select * from " + dt.TableName, CommandType.Text);
        if (trans != null)
        {
            selectCommand.Transaction = trans;
        }
        DbDataAdapter adapter = CreateDbDataAdapter(selectCommand);
        DbCommandBuilder cb = providerFactory.CreateCommandBuilder();
        cb.DataAdapter = adapter;
        cb.GetInsertCommand().Transaction = trans;
        cb.GetDeleteCommand().Transaction = trans;
        cb.GetUpdateCommand().Transaction = trans;
        adapter.Update(dt);
    }

    #endregion


    public bool IsConnection()
    {
        DbConnection conn = this.dbConnection;
        try
        {
            conn.Open();
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
        finally
        {
            conn.Close();
            conn.Dispose();
        }
    }

    public void BeginTran()
    {
        this.dbTransaction = this.dbConnection.BeginTransaction();
    }
    public void Rollback()
    {
        this.dbTransaction.Rollback();
        this.dbTransaction = null;
        //CloseConnection();
    }

    public void Commit()
    {
        this.dbTransaction.Commit();
        this.dbTransaction = null;
        //CloseConnection();
    }
    public void CloseConnection()
    {
        if (this.dbConnection.State == ConnectionState.Open)
        {
            this.dbConnection.Close();
        }
        this.dbConnection = null;
    }

    public void Dispose()
    {
        if (this.dbConnection.State != ConnectionState.Closed)
        {
            this.dbConnection.Close();
        }
    }
    public int GetMaxID(string FieldName, string TableName)
    {
        string strsql = "select max(" + FieldName + ")+1 from " + TableName;
        object obj = GetSingle(strsql);
        if (obj == null)
        {
            return 1;
        }
        else
        {
            return int.Parse(obj.ToString());
        }
    }
    public DataTable GetPageListSQL(string selectCommandText, DbParameter[] cmdParms, string strWhere, int pageSize, int pageIndex, string filedOrder, out string recordTotal)
    {
        using (SqlConnection connection = new SqlConnection(this.connectionString))
        {
            try
            {
                StringBuilder SQLString = new StringBuilder();
                SQLString.Append(@"
            BEGIN
                    DECLARE @beginRow INT;
                    DECLARE @endRow INT;

                    SET NOCOUNT ON

                    SET @beginRow = (@pageIndex - 1) * @pageSize + 1;
                    SET @endRow = @pageIndex * @pageSize;

                    --输出参数为总记录数
                    SELECT @recordTotal = COUNT(1) FROM (" + selectCommandText + @") AS my_temp WHERE " + strWhere + @";

                    --主查询返回结果集
                    SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY " + filedOrder + ") AS rows ,* FROM (" + selectCommandText + ") AS my_temp WHERE " + strWhere + @") AS main_temp 
                    WHERE rows BETWEEN CAST(@beginRow AS VARCHAR) AND CAST(@endRow AS VARCHAR) ORDER BY " + filedOrder + @";
                    SET NOCOUNT OFF
                END");
                connection.Open();
                SqlCommand cmd = new SqlCommand(SQLString.ToString(), connection);
                PrepareCommand(cmd, dbConnection, null, SQLString.ToString(), cmdParms);
                recordTotal = "0";
                cmd.Parameters.Add(new SqlParameter("@recordTotal", SqlDbType.Int, 8) { Value = int.Parse(recordTotal), Direction = ParameterDirection.Output });
                cmd.Parameters.Add(new SqlParameter("@pageSize", SqlDbType.Int, 8) { Value = pageSize });
                cmd.Parameters.Add(new SqlParameter("@pageIndex", SqlDbType.Int, 8) { Value = pageIndex });
                //cmd.Parameters.Add(new SqlParameter("@orderString", SqlDbType.VarChar, 1000) { Value = filedOrder });
                SqlDataAdapter sqlDA = new SqlDataAdapter();
                sqlDA.SelectCommand = cmd;
                DataTable ds = new DataTable();
                sqlDA.Fill(ds);
                recordTotal = cmd.Parameters["@recordTotal"].Value != DBNull.Value ? cmd.Parameters["@recordTotal"].Value.ToString() : "0";
                connection.Close();
                cmd.Parameters.Clear();
                return ds;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    public DataTable GetPageListOracle(string selectCommandText, DbParameter[] cmdParms, string strWhere, int pageSize, int pageIndex, string filedOrder, out string recordTotal)
    {
        try
        {
            string sortedSelectCommandText = selectCommandText;
            if (!string.IsNullOrEmpty(strWhere)) sortedSelectCommandText = string.Concat(selectCommandText, " WHERE ", strWhere);
            if (!string.IsNullOrEmpty(filedOrder)) sortedSelectCommandText = string.Concat(selectCommandText, " ORDER BY ", filedOrder);
            bool pagingDisable = pageIndex <= 0 || pageSize <= 0;
            StringBuilder SQLString = new StringBuilder();
            SQLString.Append(string.Concat(@"
            DECLARE
	            PagingPageCount NUMBER;
            BEGIN
	            SELECT COUNT(*) INTO :PagingRecordCount FROM (" + selectCommandText + @");
	            IF :PagingRecordCount = 0 OR :PagingDisable = 1 THEN
		            :PagingPageNumber := 1;
		            OPEN :PagingResultTable FOR ", sortedSelectCommandText, @";
	            ELSE
		            PagingPageCount := CEIL(:PagingRecordCount / :PagingPageSize);
		            IF :PagingPageNumber > PagingPageCount THEN
			            :PagingPageNumber := PagingPageCount;
		            END IF;
		            OPEN :PagingResultTable FOR
			            SELECT * FROM (
				            SELECT T1.*,ROWNUM ""PagingRowNumber""
				            FROM (", sortedSelectCommandText, @") T1
				            --WHERE ROWNUM<=:PagingPageNumber*:PagingPageSize
			            )
			            WHERE ""PagingRowNumber"">(:PagingPageNumber-1)*:PagingPageSize AND ""PagingRowNumber""<=:PagingPageNumber*:PagingPageSize
			            ORDER BY ""PagingRowNumber"";
	            END IF;
            END;"));
            OracleCommand cmd = new OracleCommand();
            PrepareCommand(cmd, dbConnection, null, SQLString.ToString(), cmdParms);
            recordTotal = "0";
            cmd.Parameters.Add("PagingRecordCount", OracleDbType.Int32, ParameterDirection.Output);
            cmd.Parameters.Add("PagingDisable", OracleDbType.Int32, pagingDisable ? 1 : 0, ParameterDirection.Input);
            cmd.Parameters.Add("PagingPageNumber", OracleDbType.Int32, pageIndex, ParameterDirection.InputOutput);
            cmd.Parameters.Add("PagingPageSize", OracleDbType.Int32, pageSize, ParameterDirection.Input);
            cmd.Parameters.Add("PagingResultTable", OracleDbType.RefCursor, ParameterDirection.Output);
            OracleDataAdapter sqlDA = new OracleDataAdapter();
            sqlDA.SelectCommand = cmd;
            DataTable dt = new DataTable();
            sqlDA.Fill(dt);
            cmd.Parameters.Clear();
            recordTotal = cmd.Parameters["@recordTotal"].Value != DBNull.Value ? cmd.Parameters["@recordTotal"].Value.ToString() : "0";
            return dt;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            dbConnection.Close();
            dbConnection.Dispose();
        }
    }
    public DataTable GetPageList(string selectCommandText, DbParameter[] cmdParms, string strWhere, int pageSize, int pageIndex, string filedOrder, out string recordTotal)
    {
        DataTable dt = new DataTable();
        recordTotal = "0";
        switch (dbType)
        {
            case DbProviderType.SqlServer:
                dt = GetPageListSQL(selectCommandText, cmdParms, strWhere, pageSize, pageIndex, filedOrder,out recordTotal);
                break;
            case DbProviderType.MySql:
                break;
            case DbProviderType.SQLite:
                break;
            case DbProviderType.Oracle:
                dt = GetPageListOracle(selectCommandText, cmdParms, strWhere, pageSize, pageIndex, filedOrder, out recordTotal);
                break;
            case DbProviderType.ODBC:
                break;
            case DbProviderType.OleDb:
                break;
            case DbProviderType.Firebird:
                break;
            case DbProviderType.PostgreSql:
                break;
            case DbProviderType.DB2:
                break;
            case DbProviderType.Informix:
                break;
            case DbProviderType.SqlServerCe:
                break;
            default:
                break;
        }
        return dt;
    }

    public void BulkToDB(DataTable dt, string targetTable, int BatchSize = 100000)
    {
        throw new NotImplementedException();
    }
}

3. 创建IDatabase接口

public interface IDatabase : IDisposable
{
    DbProviderType dbType
    {
        get;
        set;
    }

    #region 公用方法

    int GetMaxID(string FieldName, string TableName);

    bool Exists(string strSql);

    bool Exists(string strSql, params DbParameter[] cmdParms);

    #endregion

    #region  执行简单SQL语句
    /// <summary>
    /// 执行SQL语句,返回影响的记录数
    /// </summary>
    /// <param name="SQLString">SQL语句</param>
    /// <returns>影响的记录数</returns>
    int ExecuteSql(string SQLString);

    /// <summary>
    /// 执行一条计算查询结果语句,返回查询结果(object)。
    /// </summary>
    /// <param name="SQLString">计算查询结果语句</param>
    /// <returns>查询结果(object)</returns>
    object GetSingle(string SQLString);
    /// <summary>
    /// 执行查询语句,返回DataTable
    /// </summary>
    /// <param name="SQLString">查询语句</param>
    /// <returns>DataSet</returns>
    DataTable Query(string SQLString);
    DataTable Query(int startRecord, int maxRecords, string SQLString);
    DataTable GetPageList(string selectCommandText, DbParameter[] cmdParms, string strWhere, int pageSize, int pageIndex, string filedOrder, out string recordTotal);
    #endregion

    /// <summary>
    /// 执行SQL语句,返回影响的记录数
    /// </summary>
    /// <param name="SQLString">SQL语句</param>
    /// <returns>影响的记录数</returns>
    int ExecuteSql(string SQLString, params DbParameter[] cmdParms);
    void BulkToDB(DataTable dt, string targetTable, int BatchSize = 100000);
    #region 执行带参数的SQL语句


    /// <summary>
    /// 执行一条计算查询结果语句,返回查询结果(object)。
    /// </summary>
    /// <param name="SQLString">计算查询结果语句</param>
    /// <returns>查询结果(object)</returns>
    object GetSingle(string SQLString, params DbParameter[] cmdParms);

    /// <summary>
    /// 执行查询语句,返回DataTable
    /// </summary>
    /// <param name="SQLString">查询语句</param>
    /// <returns>DataSet</returns>
    DataTable Query(string SQLString, params DbParameter[] cmdParms);
    DataTable Query(int startRecord, int maxRecords, string SQLString, params DbParameter[] cmdParms);
    #endregion

    #region 存储过程操作
    /// <summary>
    /// 执行存储过程,返回影响的行数		
    /// </summary>
    /// <param name="storedProcName">存储过程名</param>
    /// <param name="parameters">存储过程参数</param>
    /// <param name="rowsAffected">影响的行数</param>
    /// <returns></returns>
    void RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected);
    void RunProcedureNoReturn(string storedProcName, IDataParameter[] parameters);
    void UpdateDateTable(DataTable dt);

    #endregion

    bool IsConnection();
    void BeginTran();
    void Rollback();
    void Commit();
    void CloseConnection();
    void Dispose();
}

4. 创建辅助类App

public class App
{
    public static string xxxConnStr = "xxxConnStr";//外省数据库
    public static string ExecPath
    {
        get
        {
            return AppDomain.CurrentDomain.BaseDirectory;
        }
    }

    public static string getProviderName(string connStr)
    {
        return ConfigurationManager.ConnectionStrings[connStr].ProviderName;
    }

    public static string getConnectString(string connStr)
    {
        return ConfigurationManager.ConnectionStrings[connStr].ConnectionString;
    }
}

5. 创建辅助类DESEncrypt

/// <summary>
/// DES加密/解密类。
/// </summary>
public class DESEncrypt
{
	public DESEncrypt()
	{			
	}

	#region ========加密======== 
    /// <summary>
    /// 加密
    /// </summary>
    /// <param name="Text"></param>
    /// <returns></returns>
	public static string Encrypt(string Text) 
	{
        return Encrypt(Text, "xxxxx");
	}
	/// <summary> 
	/// 加密数据 
	/// </summary> 
	/// <param name="Text"></param> 
	/// <param name="sKey"></param> 
	/// <returns></returns> 
	public static string Encrypt(string Text,string sKey) 
	{ 
		DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
		byte[] inputByteArray; 
		inputByteArray=Encoding.Default.GetBytes(Text); 
		des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
		des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
		System.IO.MemoryStream ms=new System.IO.MemoryStream(); 
		CryptoStream cs=new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write); 
		cs.Write(inputByteArray,0,inputByteArray.Length); 
		cs.FlushFinalBlock(); 
		StringBuilder ret=new StringBuilder(); 
		foreach( byte b in ms.ToArray()) 
		{ 
			ret.AppendFormat("{0:X2}",b); 
		} 
		return ret.ToString(); 
	} 
	#endregion
		
	#region ========解密======== 
    /// <summary>
    /// 解密
    /// </summary>
    /// <param name="Text"></param>
    /// <returns></returns>
	public static string Decrypt(string Text) 
	{
        return Decrypt(Text, "xxxxx");
	}
	/// <summary> 
	/// 解密数据 
	/// </summary> 
	/// <param name="Text"></param> 
	/// <param name="sKey"></param> 
	/// <returns></returns> 
	public static string Decrypt(string Text,string sKey) 
	{ 
		DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
		int len; 
		len=Text.Length/2; 
		byte[] inputByteArray = new byte[len]; 
		int x,i; 
		for(x=0;x<len;x++) 
		{ 
			i = Convert.ToInt32(Text.Substring(x * 2, 2), 16); 
			inputByteArray[x]=(byte)i; 
		} 
		des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
		des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); 
		System.IO.MemoryStream ms=new System.IO.MemoryStream(); 
		CryptoStream cs=new CryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write); 
		cs.Write(inputByteArray,0,inputByteArray.Length); 
		cs.FlushFinalBlock(); 
		return Encoding.Default.GetString(ms.ToArray()); 
	} 
	#endregion 
}

6. 创建DbFactory类

public class DbFactory
{
    public DbFactory() { }

    /// <summary>
    /// 根据配置文件中所配置的数据库类型
    /// 来创建相应数据库命令对象
    /// </summary>
    /// <param name="connString">connectionStringName</param>
    /// <returns></returns>
    public static IDatabase CreateDataBase(string connString)
    {
        string providername = App.getProviderName(connString);//封装的方法--根据配置文件connectionStringName获取连接字符串的ProviderName来用于后面逻辑识别数据库类型
        string connectstr = DESEncrypt.Decrypt(App.getConnectString(connString));//封装的方法--连接字符串解密

        DbProviderType dbType = DbProviderType.Oracle;
        if (providername.ToLower().Contains("oracle"))
        {
            dbType = DbProviderType.Oracle;
        }
        else if (providername.ToLower().Contains("mysqlclient"))
        {
            dbType = DbProviderType.MySql;
        }
        else if (providername.ToLower().Contains("sqlclient"))
        {
            dbType = DbProviderType.SqlServer;
        }
        else if (providername.ToLower().Contains("odbc"))
        {
            dbType = DbProviderType.ODBC;
        }

        IDatabase dbHelper;
        switch (dbType)
        {
            case DbProviderType.SqlServer:
                dbHelper = new DbHelper(connectstr, DbProviderType.SqlServer);
                break;
            case DbProviderType.MySql:
                dbHelper = new DbHelper(connectstr, DbProviderType.MySql);
                break;
            case DbProviderType.SQLite:
                dbHelper = new DbHelper(connectstr, DbProviderType.SQLite);
                break;
            case DbProviderType.Oracle:
                dbHelper = new DbHelper(connectstr, DbProviderType.Oracle);
                break;
            case DbProviderType.ODBC:
                dbHelper = new DbHelper(connectstr, DbProviderType.ODBC);
                break;
            case DbProviderType.OleDb:
                dbHelper = new DbHelper(connectstr, DbProviderType.OleDb);
                break;
            case DbProviderType.Firebird:
                dbHelper = new DbHelper(connectstr, DbProviderType.Firebird);
                break;
            case DbProviderType.PostgreSql:
                dbHelper = new DbHelper(connectstr, DbProviderType.PostgreSql);
                break;
            case DbProviderType.DB2:
                dbHelper = new DbHelper(connectstr, DbProviderType.DB2);
                break;
            case DbProviderType.Informix:
                dbHelper = new DbHelper(connectstr, DbProviderType.Informix);
                break;
            case DbProviderType.SqlServerCe:
                dbHelper = new DbHelper(connectstr, DbProviderType.SqlServerCe);
                break;
            default:
                throw new Exception("数据库类型目前不支持!");
        }
        return dbHelper;
    }
    public static string FormatSql(string sSql, DbProviderType dbType = DbProviderType.Oracle)
    {
        switch (dbType)
        {
            case DbProviderType.Oracle:
                sSql = sSql.Replace("@", ":");
                sSql = sSql.Replace("getdate()", "sysdate");
                sSql = sSql.Replace("now()", "sysdate");
                sSql = sSql.Replace("isnull(", "nvl(");
                break;
            case DbProviderType.SqlServer:
                sSql = sSql.Replace(":", "@");
                sSql = sSql.Replace("sysdate", "getdate()");
                sSql = sSql.Replace("now()", "getdate()");
                sSql = sSql.Replace("nvl(", "isnull(");
                break;
            case DbProviderType.MySql:
                sSql = sSql.Replace(":", "@");
                sSql = sSql.Replace("sysdate", "now()");
                sSql = sSql.Replace("getdate", "now()");
                sSql = sSql.Replace("nvl(", "isnull(");
                break;
        }
        return sSql;
    }
    public static DbParameter[] FormatParameter(DbParameter[] parameters, DbProviderType dbType = DbProviderType.Oracle)
    {
        List<DbParameter> dbParameters = new List<DbParameter>();
        switch (dbType)
        {
            case DbProviderType.Oracle:
                foreach (DbParameter parameter in parameters)
                {
                    dbParameters.Add(new OracleParameter(parameter.ParameterName.Replace("@", ":"), parameter.Value));
                }
                break;
            case DbProviderType.SqlServer:
                foreach (DbParameter parameter in parameters)
                {
                    dbParameters.Add(new OracleParameter(parameter.ParameterName.Replace(":", "@"), parameter.Value));
                }
                break;
            case DbProviderType.MySql:
                foreach (DbParameter parameter in parameters)
                {
                    dbParameters.Add(new OracleParameter(parameter.ParameterName.Replace(":", "@"), parameter.Value));
                }
                break;
        }
        return dbParameters.ToArray();
    }
}

 7. 调用

using (IDatabase db = DbFactory.CreateDataBase(App.xxxConnStr))
{
    StringBuilder strSql = new StringBuilder();
    strSql.Append("SELECT * FROM TESTUSER");

    DataTable dt = new DataTable();
    dt = db.Query(strSql.ToString());
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿够钟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值