數(shù)據(jù)庫(kù)應(yīng)用程序需注意的問題_Access數(shù)據(jù)庫(kù)教程
推薦: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ù)表的字段 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ù)安全策略之ASP式
- 第N次被ACCESS的關(guān)鍵字涮
- Access中用Jet SQL語句刪除表關(guān)系
- Access報(bào)表打印如何自動(dòng)分頁
- Access完成累計(jì)余額的計(jì)算
- 搭建Access為主的Mdb數(shù)據(jù)庫(kù)
- 一句sql更新兩個(gè)表并可更新對(duì)應(yīng)的字段值具體實(shí)現(xiàn)
- MySQL查詢優(yōu)化:連接查詢排序limit(join、order by、limit語句)介紹
- 內(nèi)網(wǎng)ssh/mysql登錄緩慢的解決方法
- 使用準(zhǔn)則進(jìn)行條件查詢--1.4.從窗體中選擇查詢的條件
- 中文Access2000速成教程--1.1 使用“向?qū)А痹O(shè)計(jì)數(shù)據(jù)庫(kù)
- 中文Access2000速成教程--1.3 在“設(shè)計(jì)”視圖中設(shè)計(jì)表
Access數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Access數(shù)據(jù)庫(kù)教程推薦
- 向Access數(shù)據(jù)庫(kù)上傳且顯示圖片
- 淺析在Access中模擬SqlServer存儲(chǔ)過程翻頁
- 揭秘如何在Access數(shù)據(jù)庫(kù)中使用SQL
- 如何讓asp和access數(shù)據(jù)庫(kù)連接?
- ACCESS:定義表之間的關(guān)系
- 在VB中兼容非ACCESS數(shù)據(jù)庫(kù)的技巧
- 談Access:數(shù)據(jù)轉(zhuǎn)換問題
- Access中批量替換數(shù)據(jù)庫(kù)內(nèi)容的兩種方法
- 防止ACCESS數(shù)據(jù)庫(kù)被下載的9種方法
- 談Access數(shù)據(jù)庫(kù)在線壓縮的實(shí)現(xiàn)
猜你也喜歡看這些
- short int、long、float、double使用問題說明
- 如何使用遠(yuǎn)程連接access數(shù)據(jù)庫(kù)
- 談Access為后臺(tái)數(shù)據(jù)庫(kù)的網(wǎng)站統(tǒng)計(jì)系統(tǒng)
- 解析ACCESS數(shù)據(jù)庫(kù)中Field對(duì)象的caption屬性讀寫
- 如何在退出整個(gè)系統(tǒng)前提示用戶
- 揭秘增強(qiáng)網(wǎng)站數(shù)據(jù)庫(kù)Access文件的安全性的方法
- Access數(shù)據(jù)庫(kù)開發(fā)技巧(三)
- Access 2007數(shù)據(jù)庫(kù)添加附件
- 淺析Excel和Access之間的數(shù)據(jù)交換
- 用Access設(shè)計(jì)客觀試卷(1)
- 相關(guān)鏈接:
- 教程說明:
Access數(shù)據(jù)庫(kù)教程-數(shù)據(jù)庫(kù)應(yīng)用程序需注意的問題
。