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);}#endregionpublic 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(@"BEGINDECLARE @beginRow INT;DECLARE @endRow INT;SET NOCOUNT ONSET @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 OFFEND");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(@"DECLAREPagingPageCount NUMBER;BEGINSELECT COUNT(*) INTO :PagingRecordCount FROM (" + selectCommandText + @");IF :PagingRecordCount = 0 OR :PagingDisable = 1 THEN:PagingPageNumber := 1;OPEN :PagingResultTable FOR ", sortedSelectCommandText, @";ELSEPagingPageCount := CEIL(:PagingRecordCount / :PagingPageSize);IF :PagingPageNumber > PagingPageCount THEN:PagingPageNumber := PagingPageCount;END IF;OPEN :PagingResultTable FORSELECT * FROM (SELECT T1.*,ROWNUM ""PagingRowNumber""FROM (", sortedSelectCommandText, @") T1--WHERE ROWNUM<=:PagingPageNumber*:PagingPageSize)WHERE ""PagingRowNumber"">(:PagingPageNumber-1)*:PagingPageSize AND ""PagingRowNumber""<=:PagingPageNumber*:PagingPageSizeORDER 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);#endregionbool 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());
}

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

  1. c 连接oracle 通用类,c#操作oracle,有没有相仿sqlhelp之类的通用操作类(6)

    当前位置:我的异常网» C# » c#操作oracle,有没有相仿sqlhelp之类的通用操作类 c#操作oracle,有没有相仿sqlhelp之类的通用操作类(6) www.myexceptions ...

  2. ACCESS数据库C#操作类(SQLHELPER修改版)——转自网上

    ACCESS数据库C#操作类(SQLHELPER修改版) 这个是针对ACCESS数据库操作的类,同样也是从SQLHELPER提取而来,分页程序的调用可以参考MSSQL那个类的调用,差不多的,只是提取所 ...

  3. 【技术应用】【informix】 c++版 数据库通用操作

    事物的存在都有它存在的价值, 为了简化工作量,曾经使用esql写过一个通用操作,这个是c++版本的,刚写完没有实际应用测试 实现以下功能 1.  数据库的基本操作,添加,删除,修改,查询 2.  查询 ...

  4. java mysql 操作类_Java 数据库简单操作类

    1 packagecom.latiny.db;2 3 import java.io.*;4 import java.sql.*;5 importjava.util.ArrayList;6 import ...

  5. MSSQL数据库C#操作类(SQLHELPER类的修改版)

    using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...

  6. Express框架使用以及数据库公共操作类整理(Win7下的NodeJs)

    具体步骤: 1.安装开发工具WebStorm: 2.安装node/npm(下载地址:https://nodejs.org/download/)选择适合你的xxx.mis安装: 3.安装express框 ...

  7. 自己封装的ASP.NET的SQLITE数据库的操作类

    代码 /*  * 作者: 牛腩  * 创建时间: 2010-1-20 10:43:14  * Email: 164423073@qq.com  * 说明: 对SQLite数据库的增删查改操作的封装类 ...

  8. php之mysqli通用操作类(基本体)

    工具类源码 <?phpclass sqltools {private $mysqli;//构造函数初始化连接function __construct($local, $user, $pwd, $ ...

  9. 【Redis】6.Redis key通用指令以及数据库的通用操作

    key通用指令 key特征 key是一个字符串,通过key获取redis中保存的数据 key应该设计那些操作? 对于key自身状态的相关操作,例如:删除,判定存在,获取类型等 对于key有效性控制相关 ...

最新文章

  1. 贪心:expedition 最优加油方法
  2. 跟随美国博导 12 年,我学到最深刻的不是科研,而是……
  3. try...catch的方式处理多个异常
  4. Symfony2Book04:Doctrine03-对象关系映射(ORM)
  5. GDCM:gdcm::Module的测试程序
  6. docker 查询或获取私有仓库(registry)中的镜像
  7. Mac隔空投送功能在哪? macbook隔空投送更方便的使用方法
  8. 客户引导你,还是你引导客户?
  9. FFT运算的加深理解——频谱泄露
  10. “快充”拯救续航,雅迪难称王
  11. Linux关闭防火墙
  12. 神经网络及其变种串联
  13. 3dmax室内灯光强度一般打多少才合适
  14. 基于 Fortran QuickWin 的物性计算应用程序开发示例
  15. 软件质量测试:Jmeter察看结果树的响应数据中的中文显示乱码问题处理
  16. 商城系统搭建支付通道
  17. 陌生人社交网络大起底:谁是下一个陌陌?
  18. 树莓派下载操作系统以及opencv下载
  19. js websocket同步等待_javascript – 如何等待WebSocket的readyState更改
  20. JAVA毕业设计BS架构考研交流学习平台设计与实现计算机源码+lw文档+系统+调试部署+数据库

热门文章

  1. xapp1171学习笔记
  2. 融资融券业务的要求有哪些?
  3. c/c++设计2048小游戏
  4. java凯撒加密socket,20192312吴欣欣 实验四 《数据结构与面向对象程序设计》实验报告...
  5. 程序人生:国内顶级的 8 位程序员大佬,没听过就太low了!
  6. Python爬虫(下)(已完结)
  7. 线性系统频域校正-校正必读
  8. java消息路由_SIP消息路由机制
  9. 代数重建算法(ART)详解
  10. Android学习之打造美女图片浏览器