国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

用設計模式開發通用數據庫訪問器

2024-07-21 02:22:44
字體:
來源:轉載
供稿:網友
用設計模式開發通用數據庫訪問器

      我們都希望在開發軟件的時候能少寫一些代碼,希望能到處使用,希望不用管什么樣的數據庫軟件都能用,我們該怎么辦呢?

我們操作數據庫時用到些什么類

       一般來說,我們對數據庫進行操作時都會用到一些類,下面我就對著些類做個總結:1.  sqlserver:a)         system.data.sqlclient.sqldataadapter:sql數據適配器。表示用于填充 dataset 和更新 sql server 數據庫的一組數據命令和一個數據庫連接。無法繼承此類。該類繼承于system.data.common.dbdataadapter和實現接口system.data.idbdataadapter。采用adapter模式設計。b)        system.data.sqlclient.sqlconnection:sql數據庫連接。表示 sql server 數據庫的一個打開的連接。無法繼承此類。c)        system.data.sqlclient.sqlcommandbuilder:sql數據庫命令生成器。自動生成具有以下用途的單表命令:使對 dataset 所做的更改與關聯的 sql server 數據庫相協調。無法繼承此類。采用builder模式設計。另外還有一些,但是在本文中將用不到,所以這里也就不再敘述了。2.  oracle:a)         system.data.oracleclient.oracledataadapter:oracle數據適配器。表示用于填充 dataset 和更新oracle數據庫的一組數據命令和到數據庫的連接。無法繼承此類。該類繼承于system.data.common.dbdataadapter和實現接口system.data.idbdataadapter。采用adapter模式設計。b)        system.data.oracleclient.oracleconnection:oracle數據庫連接。表示一個到oracle數據庫的打開的連接。無法繼承此類。c)        system.data.oracleclient.oraclecommandbuilder:oracle數據庫命令生成器。自動生成用于協調 dataset 的更改與關聯的oracle數據庫的單表命令。無法繼承此類。采用builder模式設計。3.  odbc:a)         system.data.odbc.odbcdataadapter:odbc類型數據數據適配器。表示數據命令集和到odbc數據源的連接,它們用于填充 dataset 以及更新該數據源。無法繼承此類。。該類繼承于system.data.common.dbdataadapter和實現接口system.data.idbdataadapter。采用adapter模式設計。b)        system.data.odbc.odbcconnection:odbc數據庫連接。表示到odbc數據源的連接是打開的。c)        system.data.odbc.odbccommandbuilder:odbc數據庫命令生成器。自動生成用于協調 dataset 的更改與關聯的odbc類型數據源的單表命令。無法繼承此類。采用builder模式設計。4.  oledb:a)         system.data.oledb.oledbdataadapter:odbc類型數據數據適配器。表示數據命令集和到oledb數據源的連接,它們用于填充 dataset 以及更新該數據源。無法繼承此類。。該類繼承于system.data.common.dbdataadapter和實現接口system.data.idbdataadapter。采用adapter模式設計。b)        system.data.oledb.oledbconnection:oledb數據庫連接。表示到oledb數據源的連接是打開的。c)        system.data.oledb.oledbcommandbuilder:oledb數據庫命令生成器。自動生成用于協調 dataset 的更改與關聯的oledb類型數據源的單表命令。無法繼承此類。采用builder模式設計。

我們需要什么樣的數據操作器

       當然是越簡單越好了,功能倒不一定要強大,夠用就行。希望能支持多種數據庫,使用這個操作器的程序不用再考慮是那種數據庫;希望能對多個數據庫操作,一個項目使用多個數據庫卻不對增加編程復雜度;希望支持事務,失敗能夠自動回滾。功能嘛,能讀取數據、更新數據就可以了。

通用數據操作器的思路

       對數據庫的操作其實就是兩件事:出和進。出呢就是從數據庫中讀取數據,進就是將數據寫回數據庫,包括新增數據、更新數據、刪除數據。       那么對這兩個件事情該怎么做呢?讀取數據時,我們是打開一個連接,實例化一個數據適配器然后填充數據集,關閉連接,即可。這里要注意的是,由于數據集里的表經常是數據庫里多個數據表join的結果,所以你甭想讓操作器自動生成查詢語句,得你自己寫。寫入數據的時候,就會有一些麻煩,但因為都是執行單表操作所以你可以不用自己寫sql語句,讓操作器自己生成好了。那么一步步怎么做呢?先打開一個數據庫連接,再生成一個查詢字符串,接著這兩個東東實例化一個數據適配器,在生成一個commandbuilder的實例并注冊為dataadapter的偵聽器,接著配置事務。然后更新數據庫,最后關閉連接。事務不能更早配置,是因為配置的事務之后便不允許數據適配器的命令為空。思路有了,后面就很簡單了,我們只需要為每一種數據庫連接定義這些操作,然后根據實際情況調用就可以了。當然我們不希望使用哪種數據庫的由調用它的系統作為參數傳入,定義在配置文件中似乎更好一些。由于可能有多個數據庫,所以我們應當體現這種情況。比如我們可以定義默認數據庫連接為“dbcon”,數據庫a的連接為“adbcon”。由于要實現多張表的操作,所以我們要定義一個數據集表和表名的映射。

代碼實現

       首先定義一個枚舉,以指定可以支持哪些數據庫:/// <summary>     /// 數據庫類型枚舉     /// </summary>     public enum dbtype     {         /// <summary>         /// sqlserver         /// </summary>         sqlserver,         /// <summary>         /// oracle         /// </summary>         oracle,         /// <summary>         /// oledb         /// </summary>         oledb,         /// <summary>         /// odbc         /// </summary>         odbc     }      定義一個類來擴展datatable:     /// <summary>     /// 用于更新數據庫的數據表、庫表名對     /// </summary>     public class datatableextend     {         /// <summary>         /// 數據表         /// </summary>         public system.data.datatable datatable;          /// <summary>         /// 數據表映射到數據庫的表名         /// </summary>         public string datatablename;          /// <summary>         /// 用于更新數據庫的數據表、庫表名對構造函數         /// </summary>         /// <param name="mytable">用于更新數據庫的數據表</param>         /// <param name="mytablename">數據表映射到數據庫的表名</param>         public datatableextend(system.data.datatable mytable, string mytablename)         {              datatable = mytable;              datatablename = mytablename;         }     }      然后寫一個類來讀取配置文件并獲取數據庫連接字符串:     /// <summary>     /// dbsetting 的摘要說明。     /// </summary>     public class dbsetting     {         /// <summary>         /// 數據庫連接字符串后綴         /// </summary>         public static string dbconnectionends         {              get              {                   return "dbcon";              }         }          /// <summary>         /// 數據庫類型后綴         /// </summary>         public static string dbtypeends         {              get              {                   return "dbtype";              }         }/// <summary>         /// 獲取指定數據庫的類型         /// </summary>         /// <param name="dbname">指定的數據庫名</param>         /// <returns>指定數據庫的類型</returns>         public static dbtype getdbtype(string dbname)         {              string dbtype = null;              dbtype = appconfig.getappsetting(dbname + dbtypeends);              if (dbtype.tolower() == dbtype.oracle.tostring().tolower())              {                   return dbtype.oracle;              }              if (dbtype.tolower() == dbtype.odbc.tostring().tolower())              {                   return dbtype.odbc;              }              if (dbtype.tolower() == dbtype.oledb.tostring().tolower())              {                   return dbtype.oledb;              }              else              {                   return dbtype.sqlserver;              }         }/// <summary>         /// 保存指定數據庫的類型         /// </summary>         /// <param name="dbtype">指定數據庫的類型</param>         /// <param name="dbname">指定的數據庫名</param>         public static void savedbtype(dbtype dbtype,string dbname)         {              appconfig.saveappsetting(dbname + dbtypeends,dbtype.tostring());         }/// <summary>         /// 獲取指定數據庫的連接字符串         /// </summary>         /// <param name="dbname">指定的數據庫名</param>         /// <returns>指定數據庫的連接字符串</returns>         public static string getdbconnectionstring(string dbname)         {              return appconfig.getappsetting(dbname + dbconnectionends);         }          /// <summary>         /// 保存指定數據庫的連接字符串         /// </summary>         /// <param name="connectionstring">連接字符串</param>         /// <param name="dbname">指定的數據庫名</param>         public static void savedbconnectionstring(string connectionstring, string dbname)         {              appconfig.saveappsetting(dbname + dbconnectionends,connectionstring);         }} 接著為每一種數據庫寫一個類來執行針對該數據庫的操作,例如針對sql server:/// <summary>     /// 用于sql數據源操作的類     /// </summary>     public class sqlexec     {         /// <summary>         /// 獲取數據庫連接,讀取由storm.appsetting的配置文件中dbname + "dbcon"的設置(如針對數據庫test的配置鍵是“testdbcon”),若沒有,則拋出異常         /// </summary>         /// <param name="dbname">要獲取數據連接的數據庫名</param>         /// <returns>得到的數據庫連接</returns>         public static sqlconnection getdbconnection(string dbname)         {              return new sqlconnection(dbsetting.getdbconnectionstring());         } private void modifydatabase(datatableextend[] dts, string dbname)         {              //打開連接              sqlconnection sqlcon = getdbconnection(dbname);              sqlcon.open();              //根據數據表的多少生成多個數據適配器并分別生成sql語句              int length = dts.length;              sqldataadapter[] mydataadapters = new sqldataadapter[length];              for (int i = 0; i < length; i++)              {                   string selecttext = getselectcommand(dts[i].datatablename);                   mydataadapters[i] = new sqldataadapter(selecttext, sqlcon);                   sqlcommandbuilder cb = new sqlcommandbuilder(mydataadapters[i]);                   mydataadapters[i].insertcommand = cb.getinsertcommand();                   mydataadapters[i].updatecommand = cb.getupdatecommand();                   mydataadapters[i].deletecommand = cb.getdeletecommand();              }              //配置事務              sqltransaction mytrans;              mytrans = sqlcon.begintransaction(isolationlevel.repeatableread);              try              {                   for (int i = 0; i < length; i++)                   {                       mydataadapters[i].selectcommand.transaction = mytrans;                       mydataadapters[i].insertcommand.transaction = mytrans;                       mydataadapters[i].updatecommand.transaction = mytrans;                       mydataadapters[i].deletecommand.transaction = mytrans;                       //更新數據庫                       mydataadapters[i].update(dts[i].datatable);                   }                   mytrans.commit();                   sqlcon.close();                   for(int i = 0; i < length ; i++)                   {                       dts[i].datatable.acceptchanges();                   }              }              //如果失敗,則自動回滾              catch(exception ee)              {                   mytrans.rollback();                   sqlcon.close();                   for(int i = 0; i < length ; i++)                   {                       dts[i].datatable.rejectchanges();                   }                   throw ee;              }         }     /// <summary>         /// 從數據庫中讀取數據         /// </summary>         /// <param name="dt">要承載數據的數據表</param>         /// <param name="selectstring">查詢語句</param>         public void getdata(datatable dt, string selectstring, string dbname)         {sqldataadapter mydataadapter = new sqldataadapter(selectstring,sqlconfig.getdbconnection(dbname));              mydataadapter.fill(dt);         }                  //自動生成查詢語句private static string getselectcommand(string datatablename)         {              string strget = "select * from " +datatablename;              return strget;         }} 然后就是寫一個類來根據實際情況調用這些東東了:public class databaseexecute     {         private string dbname;         /// <summary>         /// 目標數據庫         /// </summary>         public string dbname         {              get{ return dbname; }              set{ dbname = value; }         }              /// <summary>         /// 生成databaseexecute的實例         /// </summary>         public databaseexecute()         {              dbname = null;         }          /// <summary>         /// 用指定的目標數據庫生成databasemodifier的實例         /// </summary>         /// <param name="dbname"></param>         public databaseexecute(string dbname)         {              this.dbname = dbname;         }         /// <summary>         /// 從數據庫中讀取數據         /// </summary>         /// <param name="dt">要承載數據的數據表</param>         /// <param name="selectstring">查詢語句</param>         public void getdata(datatable dt, string selectstring)         {              //操作指定數據庫              if (dbname != null)              {                   if (dbsetting.getdbtype(dbname) == dbtype.sqlserver)                   {                       sqlexec mysqlexec = new sqlexec();                       mysqlexec. getdata(dt, selectstring, dbname);                   }                   else if (dbsetting.getdbtype(dbname) == dbtype.odbc)                   {                       odbcexec myodbcexec = new odbcexec();                       myodbcexec. getdata(dt, selectstring, dbname);                   }                   else if (dbsetting.getdbtype(dbname) == dbtype.oledb)                   {                       oledbexec myoledbexec = new oledbexec();                       mysqlexec. getdata(dt, selectstring, dbname);                   }                   else                    {                       oracleexec myoracleexec = new oracleexec();                       myoracleexec. getdata(dt, selectstring, dbname);                   }              }              //操作默認數據庫              else              {                   if (dbsetting.getdbtype(“”) == dbtype.sqlserver)                   {                       sqlexec mysqlexec = new sqlexec();                       mysqlexec. getdata(dt, selectstring, “”);                   }                   else if (dbsetting.getdbtype(“”) == dbtype.odbc)                   {                       odbcexec myodbcexec = new odbcexec();                       myodbcexec. getdata(dt, selectstring, “”);                   }                   else if (dbsetting.getdbtype(dbname) == dbtype.oledb)                   {                       oledbexec myoledbexec = new oledbexec();                       mysqlexec. getdata(dt, selectstring, “”);                   }                   else                    {                       oracleexec myoracleexec = new oracleexec();                       myoracleexec. getdata(dt, selectstring, “”);                   }              }         }          /// <summary>         /// 根據數據表組更新數據庫         /// </summary>         /// <param name="dts">要更新的數據表組</param>         public void modifydatabase(datatableextend[] dts)         {              //操作指定數據庫              if (dbname != null)              {                   if (dbsetting.getdbtype(dbname) == dbtype.sqlserver)                   {                       sqlexec mysqlexec = new sqlexec();                       mysqlexec modifydatabase(dts,dbname);                   }                   else if (dbsetting.getdbtype(dbname) ==  dbtype.odbc)                   {                       odbcexec mysqlexec = new odbcexec();                       myodbcexec modifydatabase(dts,dbname);                   }                   else if (dbsetting.getdbtype(dbname) == dbtype.oledb)                   {                       oledbexec mysqlexec = new oledbexec();                       myoledbexec modifydatabase(dts,dbname);                   }                   else                   {                       oracleexec mysqlexec = new oracleexec();                       myoracleexec modifydatabase(dts,dbname);                   }              }              //操作默認數據庫              else              {                   if (dbsetting.getdbtype(“”) == dbtype.sqlserver)                   {                        sqlexec mysqlexec = new sqlexec();                       mysqlexec modifydatabase(dts, “”);                   }                   else if (dbsetting.getdbtype(dbname) ==  dbtype.odbc)                   {                       odbcexec mysqlexec = new odbcexec();                       myodbcexec modifydatabase(dts, “”);                   }                   else if (dbsetting.getdbtype(dbname) == dbtype.oledb)                   {                       oledbexec mysqlexec = new oledbexec();                       myoledbexec modifydatabase(dts, “”);                   }                   else                   {                       oracleexec mysqlexec = new oracleexec();                       myoracleexec modifydatabase(dts, “”);                   }              }} 這樣,在項目中只要引用這個databaseexecute類就可以了。最后,要注意的幾點:1.              對于多表操作而言,因為表間有關聯,所以操作的順序很重要,本構件操作的順序是從數據表數組的前向后處理,請千萬注意表處理的順序!2.              默認數據庫連接由配置文件中“dbcon”的設置決定,非默認數據庫連接由配置文件中“*dbcon”的設置決定,其中星號代表數據庫標識3.              默認數據庫類型由配置文件中“dbcon”的設置決定,非默認數據庫類型由配置文件中“*dbcon”的設置決定,其中星號代表數據庫標識4.              針對每一個數據庫都有兩個配置,分別是數據庫連接和數據庫類型。
,歡迎訪問網頁設計愛好者web開發。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝应县| 尉氏县| 怀来县| 河南省| 崇阳县| 尼玛县| 肃北| 灵寿县| 丹凤县| 本溪| 枣阳市| 象州县| 文登市| 保亭| 台东市| 磐安县| 丰县| 泰兴市| 东安县| 青川县| 乐至县| 衡阳市| 鹿泉市| 宝山区| 延寿县| 榆林市| 登封市| 林周县| 澄江县| 凌海市| 凤凰县| 平果县| 静宁县| 泰来县| 宁武县| 张掖市| 固阳县| 玉树县| 蓝山县| 贡觉县| 赤峰市|