3.property對象與Properties集合
Property對象用來描述一個DAO對象的內部屬性或用戶定義屬性,與DAO對象及Properties集合的關系為DAO對象包含Properties集合,Properties集合包含property對象。(其關系詳見VB幫助文件)
除Connection和Error對象外,每個DAO對象都含有一個property集合,在該集合中有與相應的DAO對象的內部屬性一致的Property對象。同時,用戶可以定義Property對象並將其加入某些下列DAO對象的Properties集合:
·Database,Index,QueryDef和TableDef對象
·TableDef對象和QueryDef對象的Fields集合中的Field對象
Property有4個預定義的屬性:
·Name屬性:是一個字符串,屬性的唯一標識。
·Type屬性:是一個整型數(Integer),用來指定屬性的數據類型。
·Value屬性:是一個包含屬性設置的Variant類型的值。
·Inherited屬性:是一個Boolean值,用來指示屬性是否從另一個對象繼承而來。
Property對象既有預定義的屬性,也有用戶定義的屬性,在引用時,其格式是不一樣的。頂定義屬性的引用格式為:
對象.屬性
而用戶定義的屬性必須采用下面的引用格式:
對象.Properties.(“屬性”)
【例】編寫程序,列出Tables容器中的Documents集合,然後列出集合中的第一個Document對象的Properties集合。
在窗體上畫一個命令按鈕,然後編寫如下事件過程:
PrivateSubCommand1_Click()
DimdbsnorthwindAsDatabase
DimdocloopAsDocument
DimprploopAsProperty
Setdbsnorthwind=OpenDatabase("e:f.mdb")
Withdbsnorthwind.Containers!tables
Debug.Print"documentsin"&.Name&"container"
ForEachdocloopIn.Documents
Debug.Print""&docloop.Name
Nextdocloop
With.Documents(0)
Debug.Print"propertiesof"&.Name&"document"
OnErrorResumeNext
ForEachprploopIn.Properties
Debug.Print""&prploop.Name&"="&prploop
Nextprploop
OnErrorGoTo0
EndWith
EndWith
dbsnorthwind.Close
EndSub
程序的前半部分與前面的例子相同,後半部分列出第一個Document對象(即Documents(0)的Properties集合。運行程序,單擊命令按鈕,即可在“立即”窗口中列出上述內容。
用戶定義的屬性通過CreateProperty方法來定義,用該方法可以建立由用戶定義的Property對象(僅MicrosoftJet工作區),用於Database,Document,Field,Index,QueryDef和TableDef對象。其格式為:
setproperty=對象.CreateProperty(name,type,value,DDL)
各參數的含義如下:
·property:對象變量,要建立的Property對象。
·Object:對象變量,可以是Database,Field,Index,QueryDef和TableDef對象,可以對這些對象建立Property對象。
·name:可選。variant類型(字符串子型),唯一地命名新的Property對象。
·type:可選。常數,定義新Property對象的類型。
·value:可選。variant類型,指定屬性的初值。
·DDL:可選。Variant類型(Boolean子型),用來指示該屬性是否是一個DDl對象,缺省值為False。如果DDL為True,則不能刪除這個property對象(除非得到dbsecWriteDef的允許)。
說明:
1.)只能在一個永久對象的Property集合中建立用戶定義的Property對象。在用CreateProperty方法建立Property對象時,如果省略了一個或多個可選參數,則可在向一個集合追加新的對象之前,用賦值語句設置或重新設置相應的屬性。在向集合中追加新的對象之後,可以改變其屬性設置的一部分(不是全部)。
2.)如果name參數指的是該集合中已經存在的對象成員,則當用Append方法追加時,將會出現錯誤。
3.)為了從集合中刪除一個由用戶定義的屬性對象,可以用集合的Delete方法來實現。該方法只能刪除用戶定義的對象,不能刪除預定義屬性。
4.)如果省略了DDL參數,則缺省為False(即非DDL)。在這種情況下,沒有出現相應的DDL屬性,如果需要將一個Property對象由DDL變為DDL,則必須先刪除,然後再重新建立。
5.)CreateProperty方法中的type參數是一個符號常量,它是Property對象的設置值或返回值,其可能的取值見表3
type參數的取值
常數類型常數類型
dbBigIntBig整型數dbGUIDGUID
dbBinary二進制dbInteger整型數
dbBoolean布爾值dbLong長整型數
dbByte字節dbLongBinary長二進制(OEL對象)
dbChar字符dbMemoMemo
dbCurrency貨幣dbNumeric數值
dbDate日期/時間dbsingle單精度
dbDecimal十進制dbText文本
dbDouble雙精度dbTime時間
dbFloat浮點數dbTimeStampTimeStamp
dbVarBinaryVarBinary
(表3)
設MyDB是一個Database對象變量,MyPro是一個Property對象變量,則可以用下面的程序建立Property對象:
setMyPro=MyDB.createProperty()
MyPro.Name="NewDefined"
MyPro.Type=dbText
MyPro.Value="這是一個用戶定義的屬性"
可以用下面的語句把新建立的屬性加到Properties集合中:
MyDB.Properties.AppendprpNew
【例】編寫程序,建立用戶定義的Property對象,並把它加到Properties集合中。在窗體上畫一個命令按鈕,然後編寫如下的事件過程。
PrivateSubCommand1_Click()
DimdbsnorthwindAsDatabase
DimprpnewAsProperty
DimprploopAsProperty
Setdbsnorthwind=OpenDatabase("e:f.mdb")
Withdbsnorthwind
'建立並添加用戶定義的屬性
Setprpnew=.CreateProperty()
prpnew.Name="userdefinednew"
prpnew.Type=dbText
prpnew.Value="thisisauser_definednewproperty."
.Properties.Appendprpnew
'列出當前數據庫的所有屬性
Debug.Print"propertiesof"&.Name
ForEachprploopIn.Properties
Withprploop
Debug.Print""&Name
Debug.Print"type:"&.Type
Debug.Print"inherited:"&.Inherited
EndWith
Nextprploop
EndWith
EndSub
上述程序建立了一個名為userdefinednew的屬性,其類型為dbText,初值為“thisisauser_definednewproperty。”運行程序,單擊按鈕,將建立該屬性,並在立即窗口中顯示當前數據庫的所有屬性。(包括新建立的屬性)->