使用静态工厂模式,通过传入枚举型参数 ,动态创建访问实例
实现模式上采用基本实现接口,派生类继承基类的虚函数,从而实现代码的耦合较低,有很好的扩展性。
public
enum
DBType
...
{ Access, SQL, DB2, Oracle, MySQL }
public
static
class
DBAccessFactory
...
{ public static IDBAccess Create(DBType type) ... { IDBAccess IRet = null ; switch (type) ... { case DBType.Access: IRet = new Access(type); break ; case DBType.SQL: IRet = new SQL(type); break ; default : break ; } return IRet; } private abstract class DBAccess : IDBAccess ... { protected DbConnection m_oConn = null ; protected const string CON_strServer = " Server " ; protected const string CON_strDataBase = " Data Source " ; protected const string CON_strUser = " UID " ; protected const string CON_strPwd = " PWD " ; protected const string CON_strConnTimeOut = " Connect Timeout = 2 " ; private DBType m_eDBType = DBType.Access; protected DBAccess(DBType type) ... { this .m_eDBType = type; } public DBType DBType ... { get ... { return this .m_eDBType; } } public void Init( string strServer, string strDataBase, string strUser, string strPwd) ... { this .InitConn(strServer, strDataBase, strUser, strPwd); } public void Open() ... { if ( this .m_oConn != null ) ... { this .m_oConn.Open(); } } public int RunNoQuery( string strCmd) ... { int iRet = 0 ; try ... { DbCommand oCmd = this .GetCmd(strCmd); if (oCmd != null ) ... { iRet = oCmd.ExecuteNonQuery(); } } catch (Exception ex) ... { throw ( new Exception(ex.Message)); } return iRet; } public int GetFiledMax( string strTable, string strField) ... { int iRet = - 1 ; DataTable dt = this .RunQuery( " Select Max( " + strField + " ) From " + strTable); if (dt != null && dt.Rows.Count == 1 ) ... { iRet = dt.Rows[ 0 ][ 0 ] is DBNull ? 0 : Convert.ToInt32(dt.Rows[ 0 ][ 0 ]); } return iRet; } public DataTable RunQuery( string strCmd) ... { DataTable dt = new DataTable(); DbDataAdapter adp = this .DbAdp; adp.SelectCommand = this .GetCmd(strCmd); adp.Fill(dt); return dt; } public void Close() ... { if ( this .m_oConn != null && this .m_oConn.State == System.Data.ConnectionState.Open) ... { this .m_oConn.Close(); } } public bool TestConn() ... { bool bRet = true ; try ... { if ( this .m_oConn.State != System.Data.ConnectionState.Open) ... { this .m_oConn.Open(); } bRet = this .m_oConn.State == System.Data.ConnectionState.Open; } catch ... { bRet = false ; } this .Close(); return bRet; } public abstract DataTable Tables ... { get ; } public abstract DataTable GetColumns(); public abstract DataTable GetColumns( string strTable); protected abstract void InitConn( string strServer, string strDataBase, string strUser, string strPwd); protected abstract DbCommand GetCmd( string strCmd); protected abstract DbDataAdapter DbAdp ... { get ;} } }