c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE, MYSQL)(一)收藏首先定义数据库操作的标准接口IDBAccess,定义接口的基本功能;通过基本的接口设置,完成数据访问的统一抽象。
public interface IDBAccess{void Init(string strServer, string strDataBase, string strUser, string str Pwd);void Open();void Close();bool TestConn();int RunNoQuery(string strCmd);DataTable RunQuery(string strCmd);DBType DBType { get;}int GetFiledMax(string strTable, string strField);DataTable Tables { get; }DataTable GetColumns();DataTable GetColumns(string strTable);}c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE, MYSQL)(二)收藏使用静态工厂模式,通过传入枚举型参数,动态创建访问实例实现模式上采用基本实现接口,派生类继承基类的虚函数,从而实现代码的耦合较低,有很好的扩展性。
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 Timeou t = 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 strUse r, 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 + ") Fro m " + 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 strDataBas e, string strUser, string strPwd);protected abstract DbCommand GetCmd(string strCmd);protected abstract DbDataAdapter DbAdp { get;}}}c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE, MYSQL)(三)收藏各派生类的具体实现,此时只要实现DBAccess的各个虚函数即可。
private class Access : DBAccess{public Access(DBType type): base(type){}protected override void InitConn(string strServer, string strDataBas e, string strUser, string strPwd){string strConn = "Provider = ";switch (strDataBase.Substring(stIndexOf('.') + 1). ToLower()){case "mdb": // 2000, 2003strConn += "Microsoft.Jet.OleDb.4.0;";break;case "accdb": // 2007strConn += "Microsoft.ACE.OLEDB.12.0;";break;default:throw (new Exception("Unknown Access Version."));//break;}strConn += CON_strDataBase + " = " + strDataBase;//strConn += CON_strUser + " = " + strUser;//strConn += CON_strPwd + " = " + strPwd;base.m_oConn = new OleDbConnection(strConn);}protected override DbCommand GetCmd(string strCmd)return new OleDbCommand(strCmd, (OleDbConnection)base.m_ oConn);}protected override DbDataAdapter DbAdp{get { return new OleDbDataAdapter(); }}public override DataTable Tables{get{return ((OleDbConnection)base.m_oConn).GetOleDbSchema Table(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });}}public override DataTable GetColumns(){DataTable dt = new DataTable();foreach (DataRow row in this.Tables.Rows){dt.Merge(this.GetColumns(row["TABLE_NAME"].ToString()));}return dt;}public override DataTable GetColumns(string strTable)return ((OleDbConnection)base.m_oConn).GetOleDbSchemaTa ble(OleDbSchemaGuid.Columns, new object[] { null, null, strTable, null });}}private class SQL : DBAccess{public SQL(DBType type): base(type){}protected override void InitConn(string strServer, string strDataBas e, string strUser, string strPwd){string strConn = CON_strServer + " = " + strServer + ";";strConn += CON_strDataBase + " = " + strDataBase + ";";strConn += CON_strUser + " = " + strUser + ";";strConn += CON_strPwd + " = " + strPwd + ";";strConn += CON_strConnTimeOut;base.m_oConn = new SqlConnection(strConn);}protected override DbCommand GetCmd(string strCmd){return new SqlCommand(strCmd, (SqlConnection)base.m_oCon n);}protected override DbDataAdapter DbAdp{get { return new SqlDataAdapter(); }}public override DataTable Tables{get { return ((SqlConnection)base.m_oConn).GetSchema("Tabl es", null); }}public override DataTable GetColumns(){return ((SqlConnection)base.m_oConn).GetSchema("Columns", n ull);}public override DataTable GetColumns(string strTable){return ((SqlConnection)base.m_oConn).GetSchema("Columns ", new string[] { null, null, strTable, null });}}c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE, MYSQL)(四)收藏整个例子的完整代码如下,VS2008下编译测试通过,本人已通过它实现N个项目,欢迎大家评测,谢谢指教public enum DBType{Access,SQL,DB2,Oracle,MySQL}public interface IDBAccess{void Init(string strServer, string strDataBase, string strUser, string str Pwd);void Open();void Close();bool TestConn();int RunNoQuery(string strCmd);DataTable RunQuery(string strCmd);DBType DBType { get;}int GetFiledMax(string strTable, string strField);DataTable Tables { get; }DataTable GetColumns();DataTable GetColumns(string strTable);}public static class DBAccessFactory{public static IDBAccess Create(DBType type){IDBAccess IRet = null;switch (type){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 Timeou t = 2";private DBType m_eDBType = DBType.Access;protected DBAccess(DBType type){this.m_eDBType = type;}{get { return this.m_eDBType; }}public void Init(string strServer, string strDataBase, string strUse r, 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 + ") Fro m " + 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();}Access, SQL }。