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

字號(hào):

總的來(lái)說(shuō),提高應(yīng)用程序性能的的方法是發(fā)現(xiàn)應(yīng)用的瓶徑之所在,和數(shù)據(jù)庫(kù)進(jìn)行交互的性能無(wú)疑是決定應(yīng)用程序性能的重要環(huán)節(jié)之一。
    因?yàn)锳DO是當(dāng)前最新的基于組件的數(shù)據(jù)庫(kù)編程的接口,這里我們主要討論用ADO編程所需要注意的問(wèn)題,因?yàn)锳DO是一個(gè)和編程語(yǔ)言無(wú)關(guān)的COM組件系統(tǒng),所以這里討論的要點(diǎn)適用于所有的編程語(yǔ)言和編程環(huán)境,比如:VB、VBScript、VC、Java等等。
    顯式的定義對(duì)象變量的類(lèi)型:
    實(shí)際上,這條準(zhǔn)則不僅適用于ADO編程,也適用于其他的COM對(duì)象相關(guān)的編程,因?yàn)槿绻婚_(kāi)始就定義變量類(lèi)型的話(huà),編譯器在編譯的時(shí)候就可以知道變量的類(lèi)型,編譯器實(shí)際上就采用vtable偏移的方式來(lái)得到具體的COM對(duì)象包含的方法的地址(這一點(diǎn)和C++中的虛函數(shù)的地址的獲取類(lèi)似),但如果一開(kāi)始不指定變量類(lèi)型的話(huà),比如簡(jiǎn)單的采用如下的語(yǔ)句:
    DIM myCon as Object
    或者是
    DIM myCon
    那么編譯器在編譯的時(shí)候就不能得到變量的類(lèi)型,而只能在運(yùn)行的時(shí)候動(dòng)態(tài)的得到方法的信息(通過(guò)使用接口IDispatch的方法Invoke來(lái)實(shí)現(xiàn)的),這樣為了得到方法的地址和相關(guān)的變量情況就需要在內(nèi)部進(jìn)行兩次調(diào)用,無(wú)疑就使速度降低。
    當(dāng)瀏覽記錄的時(shí)候,綁定列到具體的字段對(duì)象上去
    這個(gè)意思就是說(shuō)在一開(kāi)始的時(shí)候我們就建立對(duì)字段對(duì)象的引用,避免在每次得到記錄的時(shí)候需要在Rcordset::Fields中進(jìn)行查找而增加系統(tǒng)的開(kāi)銷(xiāo)。
    比如可以采用如下的示例代碼形式:
    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語(yǔ)句和存儲(chǔ)過(guò)程進(jìn)行數(shù)據(jù)更新
    盡管采用Recordset對(duì)象來(lái)更新數(shù)據(jù)是非常方便的,但是它的開(kāi)銷(xiāo)也更大,所以如果可能的話(huà),就要采用SQL語(yǔ)句來(lái)更新數(shù)據(jù)。使用存儲(chǔ)過(guò)程而不是單一的SQL語(yǔ)句來(lái)獲取信息。因?yàn)榇鎯?chǔ)過(guò)程是在服務(wù)器端執(zhí)行的,只把結(jié)果返回到客戶(hù)端,這樣一方面可以降低網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交互的開(kāi)銷(xiāo),另一方面使系統(tǒng)更加容易維護(hù),并且保持?jǐn)?shù)據(jù)的一致性。而如果使用recordset來(lái)得到結(jié)果的話(huà),通過(guò)數(shù)據(jù)源對(duì)象返回的查詢(xún)集不僅包含了數(shù)據(jù),而且也包含了元數(shù)據(jù)(metadata),在有些時(shí)候元數(shù)據(jù)可能比數(shù)據(jù)本身還要大,這樣系統(tǒng)的開(kāi)銷(xiāo)無(wú)疑也增加了不少。
    如果必須要使用游標(biāo)的話(huà),使用集合的方法對(duì)單條的SELECT語(yǔ)句進(jìn)行操作
    Recordset::get_Collect和Recordset::put_Collect方法是Recordset 對(duì)象的快捷方式,可以使你快速的得到一個(gè)字段的值而不需要獲得關(guān)于一個(gè)字段的引用。可以參考如下的示例代碼:
    Sub Collect()
    Dim rs As New Recordset
    rs.ActiveConnection = "…"
    rs.Source = "一條SQL查詢(xún)語(yǔ)句"
    rs.Open
    Debug.Print rs.Collect(0), rs.Collect(1), rs.Collect(2)
    Debug.Print rs!au_id, rs!au_fname, rs!au_lname