日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

數(shù)據(jù)庫(kù)應(yīng)用程序需注意的問題_Access數(shù)據(jù)庫(kù)教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:Access數(shù)據(jù)庫(kù)開發(fā)技巧(二)
  窗體、查詢、報(bào)表、宏的聯(lián)合使用   將窗體、查詢、報(bào)表、宏聯(lián)合使用可以解決許多問題,是一項(xiàng)重要的技巧。   1、從窗體中獲得查詢中的條件   對(duì)于這個(gè)問題這里以

總的來說,提高應(yīng)用程序性能的最好的方法是發(fā)現(xiàn)應(yīng)用的瓶徑之所在,和數(shù)據(jù)庫(kù)進(jìn)行交互的性能無疑是決定應(yīng)用程序性能的重要環(huán)節(jié)之一。因?yàn)锳DO是當(dāng)前最新的基于組件的數(shù)據(jù)庫(kù)編程的接口,這里我們主要討論用ADO編程所需要注意的問題,因?yàn)锳DO是一個(gè)和編程語言無關(guān)的COM組件系統(tǒng),所以這里討論的要點(diǎn)適用于所有的編程語言和編程環(huán)境,比如:VB、VBScript、VC、Java等等。

顯式的定義對(duì)象變量的類型:

實(shí)際上,這條準(zhǔn)則不僅適用于ADO編程,也適用于其他的COM對(duì)象相關(guān)的編程,因?yàn)槿绻婚_始就定義變量類型的話,編譯器在編譯的時(shí)候就可以知道變量的類型,編譯器實(shí)際上就采用vtable偏移的方式來得到具體的COM對(duì)象包含的方法的地址(這一點(diǎn)和C 中的虛函數(shù)的地址的獲取類似),但如果一開始不指定變量類型的話,比如簡(jiǎn)單的采用如下的語句:

DIM myCon as Object

或者是

DIM myCon

那么編譯器在編譯的時(shí)候就不能得到變量的類型,而只能在運(yùn)行的時(shí)候動(dòng)態(tài)的得到方法的信息(通過使用接口IDispatch的方法Invoke來實(shí)現(xiàn)的),這樣為了得到方法的地址和相關(guān)的變量情況就需要在內(nèi)部進(jìn)行兩次調(diào)用,無疑就使速度降低。

當(dāng)瀏覽記錄的時(shí)候,綁定列到具體的字段對(duì)象上去

這個(gè)意思就是說在一開始的時(shí)候我們就建立對(duì)字段對(duì)象的引用,避免在每次得到記錄的時(shí)候需要在Rcordset::Fields中進(jìn)行查找而增加系統(tǒng)的開銷。

比如可以采用如下的示例代碼形式:

以下為引用的內(nèi)容:

  Private Sub TblBrowse_Click()

   Dim fld1 As ADODB.Field

   Dim fld2 As ADODB.Field

   Dim rs As ADODB.Recordset

   set rs=g_cn.execute(...) g_cn為全局adodb.connection對(duì)象

   Set fld1 = rs.Fields("id") 數(shù)據(jù)表的字段

   Set fld2 = rs.Fields("name") 數(shù)據(jù)表的字段
   If rs.BOF = False Then

    While rs.BOF = False

     Debug.Print fld1.Value

     Debug.Print fld2.Value

     rs.MoveNext

    Wend

   End If

   rs.Close

  End Sub

盡量采用SQL語句和存儲(chǔ)過程進(jìn)行數(shù)據(jù)更新

盡管采用Recordset對(duì)象來更新數(shù)據(jù)是非常方便的,但是它的開銷也更大,所以如果可能的話,就要采用SQL語句來更新數(shù)據(jù)。使用存儲(chǔ)過程而不是單一的SQL語句來獲取信息。因?yàn)榇鎯?chǔ)過程是在服務(wù)器端執(zhí)行的,只把結(jié)果返回到客戶端,這樣一方面可以降低網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交互的開銷,另一方面使系統(tǒng)更加容易維護(hù),并且保持?jǐn)?shù)據(jù)的一致性。而如果使用recordset來得到結(jié)果的話,通過數(shù)據(jù)源對(duì)象返回的查詢集不僅包含了數(shù)據(jù),而且也包含了元數(shù)據(jù)(metadata),在有些時(shí)候元數(shù)據(jù)可能比數(shù)據(jù)本身還要大,這樣系統(tǒng)的開銷無疑也增加了不少。

如果必須要使用游標(biāo)的話,最好使用集合的方法對(duì)單條的SELECT語句進(jìn)行操作

Recordset::get_Collect和Recordset::put_Collect方法是Recordset 對(duì)象的快捷方式,可以使你快速的得到一個(gè)字段的值而不需要獲得關(guān)于一個(gè)字段的引用�?梢詤⒖既缦碌氖纠a:

以下為引用的內(nèi)容:

  Sub Collect()

   Dim rs As New Recordset

   rs.ActiveConnection = "…"

   rs.Source = "一條SQL查詢語句"

   rs.Open

   Debug.Print rs.Collect(0), rs.Collect(1), rs.Collect(2)

   Debug.Print rs!au_id, rs!au_fname, rs!au_lname

  End Sub

只查詢你所需要的數(shù)據(jù)

盡管很多開發(fā)人員都習(xí)慣采用"SELECT * FROM TBL"的模式進(jìn)行查詢,但是為了提高系統(tǒng)的效率,如果你只需要其中某幾個(gè)字段的值的話,最好把這幾個(gè)字段直接寫出來,同時(shí)需要限定返回記錄集的范圍(通過WHERE子句進(jìn)行限定)

正確選擇游標(biāo)的位置、類型和鎖方式

如果你只需要按順序讀取記錄并且不需要滾動(dòng)和更新記錄的話,使用服務(wù)器端游標(biāo)(adUseServer)、僅向前游標(biāo)(adOpenForwardOnly)和讀鎖(adLockReadOnly)可以使你獲得最好的性能。如果你需要滾動(dòng)記錄的話,采用客戶端游標(biāo)(adUseServer)會(huì)比采用服務(wù)器端游標(biāo)所得到的性能要好,ADO系統(tǒng)默認(rèn)是采用服務(wù)器端游標(biāo)類型的。當(dāng)然如果數(shù)據(jù)集合相當(dāng)大的話,采用服務(wù)器端游標(biāo)的性能會(huì)好一些。同時(shí)需要注意的話,如果采用客戶端游標(biāo)的話,最好只采用讀加鎖(adLockReadOnly)的鎖類型,因?yàn)槿绻阈枰聰?shù)據(jù)的話,客戶端游標(biāo)引擎需要得到額外的信息(元數(shù)據(jù)),而這個(gè)信息的獲取是非常昂貴的。

調(diào)整記錄集對(duì)象(Recordset)CacheSize的屬性

ADO使用記錄集對(duì)象的CacheSize的屬性來決定提取和緩存的記錄的數(shù)目,當(dāng)你在緩存的范圍內(nèi)瀏覽數(shù)據(jù)的話,ADO就只從緩存中提取數(shù)據(jù)。當(dāng)你要瀏覽的數(shù)據(jù)超出緩存的范圍的時(shí)候,ADO就釋放緩存,提取下一些記錄(提取的數(shù)目為CacheSize的大�。D惚仨毟鶕�(jù)你具體的應(yīng)用程序的情況來設(shè)定CacheSize的大小保證你得到最好的性能。

自己定義command對(duì)象的參數(shù)

在許多數(shù)據(jù)源中,得到參數(shù)信息和執(zhí)行命令的代價(jià)幾乎是一樣的,所以如果可能的話,你要自己在程序中定義好command參數(shù)(也就是說要定義好參數(shù)的名稱、類型和方向信息),而避免從數(shù)據(jù)提供者(Provider)那里獲取信息.

使用原始的OLE DB提供者

MDAC對(duì)許多數(shù)據(jù)源提供了原始的數(shù)據(jù)提供者,比如SQL Server,Oracle和ACCESS數(shù)據(jù)庫(kù),這樣你不需要再通過ODBC來獲取數(shù)據(jù)(也就是說不需要再通過ODBC驅(qū)動(dòng)這一層),這樣的好處是你能更快的得到數(shù)據(jù),并且降低磁盤和內(nèi)存的開銷。

如果使用客戶端游標(biāo)的話,斷開connection連接

ADO有一個(gè)特征是當(dāng)使用客戶端游標(biāo)操作Recordset記錄集的時(shí)候,不需要和服務(wù)器進(jìn)行聯(lián)系。你可以充分利用這個(gè)特征降低服務(wù)器端的開銷(服務(wù)器就不需要維護(hù)這些連接了),當(dāng)你操作完記錄集需要更新的話,可以重新和數(shù)據(jù)庫(kù)進(jìn)行連接來更新數(shù)據(jù)。為了創(chuàng)建一個(gè)可以斷開連接的記錄集,你同時(shí)也需要使用靜態(tài)游標(biāo)(adOpenStatic)和批處理的加鎖模式(adLockBatchOptimistic)。下面的示例是用VC寫的:

以下為引用的內(nèi)容:

……

  pRs.CreateInstance(__uuid(Recordset));

  pRs->CursorLoction=adUseClient;

  pRs->Open(strCmdText,strConnection,adOpenStatic,adLockBatchOptimistic,adCmdText);

  pRs->PutRefActiveConnection(NULL);

  file://這里可以對(duì)記錄集對(duì)象pRs進(jìn)行操作

  pRs->PutRefAxctiveConnection(pCon); file://重新和數(shù)據(jù)庫(kù)建立連接

  pRs->UpdateBatch(adAffectAll); file://批量更新數(shù)據(jù)

需要注意的是,當(dāng)你執(zhí)行批量更新的話,你必須自己處理數(shù)據(jù)沖突問題,因?yàn)楫?dāng)你更新數(shù)據(jù)的時(shí)候,其他人可能也正在對(duì)該數(shù)據(jù)進(jìn)行操作。

如果不需要返回記錄的話,使用adExecuteNoRecords選項(xiàng)

ADO 2.0包括一個(gè)新的執(zhí)行選項(xiàng)稱為adExecuteNoRecords,當(dāng)使用該選項(xiàng)的時(shí)候,ADO就不會(huì)創(chuàng)建記錄集對(duì)象,不設(shè)置任何游標(biāo)屬性。數(shù)據(jù)提供者因?yàn)椴恍枰J(rèn)證行集合的屬性而使性能得到優(yōu)化。具體的例子如下:

con.Execute "insert into tbl values(fv1, fv2) ", , adExecuteNoRecords

對(duì)僅有一條的執(zhí)行語句采用Connection::Execute的方法比使用Recordset::Open或者是Command::Execute的效果要好,因?yàn)锳DO不保留任何命令狀態(tài)的信息,因此執(zhí)行性能就有所改進(jìn)。

使用session/connection緩沖池

我們知道,數(shù)據(jù)庫(kù)的打開和關(guān)閉是很消耗系統(tǒng)資源的。因此,連接池對(duì)基于多層的應(yīng)用的性能有很大的提高,當(dāng)你使用MDAC的時(shí)候,開發(fā)人員本身并不需要考慮對(duì)數(shù)據(jù)庫(kù)連接的緩存,MDAC會(huì)自動(dòng)處理它。連接池在兩個(gè)層次上提供支持,OLE DB sessions和ODBC連接。如果你使用ADO的話,你的數(shù)據(jù)庫(kù)連接會(huì)自動(dòng)被OLE DB session緩沖池所緩存。如果使用ODBC的話,在ODBC數(shù)據(jù)源管理中新的連接緩沖池選項(xiàng)可以讓你對(duì)ODBC緩沖進(jìn)行設(shè)置,然后ODBC驅(qū)動(dòng)程序會(huì)為你做剩下的事情。

分享:如何設(shè)置ACCESS2003(運(yùn)行時(shí))的宏安全性級(jí)別
ACCESS2003版本加了宏安全性級(jí)別的設(shè)置,方法: 操作菜單 可以自定義菜單,或直接調(diào)用菜單上的操作: CommandBars("menu bar").Controls("工具(&T)").Controls(&q

來源:模板無憂//所屬分類:Access數(shù)據(jù)庫(kù)教程/更新時(shí)間:2008-08-22
相關(guān)Access數(shù)據(jù)庫(kù)教程