專利名稱::在數(shù)據(jù)庫存儲(chǔ)中存儲(chǔ)和檢索被封裝為對(duì)象的xml數(shù)據(jù)的系統(tǒng)和方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計(jì)算機(jī)系統(tǒng)中的數(shù)據(jù)存儲(chǔ),尤其涉及在數(shù)據(jù)庫存儲(chǔ)中存儲(chǔ)和檢索作為用戶定義類型的字段的XML數(shù)據(jù)的系統(tǒng)和方法。(2)
背景技術(shù):
:MicrosoftSQLSERVER是一個(gè)綜合數(shù)據(jù)庫管理平臺(tái),提供廣泛的數(shù)據(jù)管理和開發(fā)工具強(qiáng)大的提取、變換和加載(extraction,transformation,andloading,ETL)工具、商業(yè)智能和分析服務(wù),以及其他能力。最近已經(jīng)實(shí)現(xiàn)對(duì)SQLSERVER的兩項(xiàng)改進(jìn)。首先,MicrosoftWindows.net框架公共語言運(yùn)行時(shí)間(CommonLanguageRuntime,CLR)已經(jīng)被集成到SQLSERVER數(shù)據(jù)庫中。其次,被稱為用戶定義類型(UserDefinedType,UDT)的新對(duì)象,可以用CLR環(huán)境中的受管代碼創(chuàng)建,并持久保存在在數(shù)據(jù)庫存儲(chǔ)中。CLR是Micr受osoft.net框架的核心,為所有.net代碼提供執(zhí)行環(huán)境。因此,在CLR中運(yùn)行的代碼被稱為"受管代碼"。CLR提供程序執(zhí)行所必需的各種函數(shù)和服務(wù),包括即時(shí)(just-in-time,JIT)編譯、分配和管理內(nèi)存、增強(qiáng)類型安全、異常處理、線程管理和安全。目前CLR由SQLSERVER在緊接著第一次調(diào)用.net例程之后加載。在SQLSERVER的早期版本中,數(shù)據(jù)庫程序員編寫服務(wù)器端的代碼時(shí)只能使用Transact-SQL。Transact-SQL是由國際標(biāo)準(zhǔn)化組織(ISO)和美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)定義的結(jié)構(gòu)化查詢語言的擴(kuò)展。使用Transact-SQL,數(shù)據(jù)庫開發(fā)者可以創(chuàng)建、修改和刪除數(shù)據(jù)庫和表,以及插入、檢索、修改和刪除存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù)。Transact-SQL專門為直接結(jié)構(gòu)數(shù)據(jù)訪問和操作而設(shè)計(jì)。盡管Transact-SQL擅長于數(shù)據(jù)訪問和管理,但它并不像VisualBasic.net和C#那樣是一門成熟的編程語言。例如,Transact-SQL不支持?jǐn)?shù)組、集合、用于每個(gè)循環(huán)、位移或類。借助于集成到SQLSERVER數(shù)據(jù)庫中的CLR,數(shù)據(jù)庫開發(fā)者現(xiàn)在可以執(zhí)行僅借助于Transact-SQL不可能或難以達(dá)成的任務(wù)。VisualBasic.net和C井都是現(xiàn)代編程語言,提供對(duì)數(shù)組、結(jié)構(gòu)化異常處理和集合的全面支持。開發(fā)者可以利用CLR集成,使用像VisualBasic.net和Ctf那樣的語言來編寫具有更復(fù)雜邏輯和更適用于計(jì)算任務(wù)的代碼。除了CLR集成之外,SQLSERVER也增加了對(duì)用戶定義類型(UserDefinedTypes,UDT)—一使開發(fā)者能夠擴(kuò)展數(shù)據(jù)庫的標(biāo)量類型系統(tǒng)的新機(jī)制一一的支持。UDT提供來自應(yīng)用程序模式前景的兩種關(guān)鍵優(yōu)點(diǎn)提供內(nèi)部狀態(tài)和外部行為之間的強(qiáng)封裝(在客戶機(jī)和服務(wù)器中),并提供與其他相關(guān)服務(wù)器特征的深度集成。一旦定義了一個(gè)UDT,就可以將其用于SQLSERVER中可以使用系統(tǒng)類型的所有上下文,包括用于列定義、變量、參數(shù)、函數(shù)結(jié)果、光標(biāo)、觸發(fā)器和復(fù)制中。在數(shù)據(jù)庫服務(wù)器上定義UDT的過程實(shí)現(xiàn)如下a)在受管代碼中創(chuàng)建一個(gè)符合UDT創(chuàng)建規(guī)則的類;b)使用CREATEASSEMBLY語句,將包含UDT的匯編加載進(jìn)服務(wù)器的數(shù)據(jù)庫中的程序集;以及c)使用CREATEASSEMBLY語句,在數(shù)據(jù)庫中創(chuàng)建公開受管代碼UDT的類型。此時(shí),UDT可以用于表定義中。在受管代碼中創(chuàng)建UDT定義時(shí),該類型必須滿足下列要求-a)它必須被標(biāo)記為可序列化(Serializable);b)它必須用SqlUserDefinedTypeAttribute修飾;c)通過實(shí)現(xiàn)INullable接口,該類型應(yīng)該是NULL有效的;d)該類型必須有一個(gè)沒有形式參數(shù)的公共構(gòu)造函數(shù);以及e)該類型應(yīng)該通過實(shí)現(xiàn)下列方法來支持從字符串和到字符串的轉(zhuǎn)換1.PublicStringToString();以及2.PublicShared<type>Parse(SqlStrings)。共同待批的、于2003年10月23日提交的序列號(hào)為_、發(fā)明名稱為"數(shù)據(jù)庫存儲(chǔ)中對(duì)象持久保存的系統(tǒng)和方法(SystemAndMethodForObjectPersistenceInADatabaseStore),,(代理記錄號(hào)MSFT-2852/306819.1)的(美國)專利申請(qǐng),該專利申請(qǐng)整體引用在此作為參考。該專利申請(qǐng)描述UDT的另一個(gè)特征,其中用存儲(chǔ)屬性注釋了用于UDT的CLR類定義的字段和行為,該存儲(chǔ)屬性描述用于數(shù)據(jù)庫存儲(chǔ)中UDT實(shí)例的布局結(jié)構(gòu)。具體來說,用存儲(chǔ)屬性注釋定義UDT的CLR類的每個(gè)字段,該存儲(chǔ)器屬性控制類型存儲(chǔ)的諸方面如大小、精度、比例等等。在一個(gè)實(shí)施例中,通過用名為SqlUdtField()的定制存儲(chǔ)屬性注釋每個(gè)字段來達(dá)到這一目的。這一屬性用另外的存儲(chǔ)指令注釋諸字段。當(dāng)對(duì)象被序列化(serialize)到磁盤時(shí),這些指令被執(zhí)行。另外,用指示該受管行為的等效結(jié)構(gòu)訪問路徑的屬性來注釋在CLR類中被定義的每一受管行為(例如,可以在UDT對(duì)象上被調(diào)用以(比如)返回一字段值的一個(gè)方法)。在一個(gè)實(shí)施例中,用于這一目的的定制屬性名為SqlUdtProperty(),并且數(shù)據(jù)庫服務(wù)器(例如,SQLSERVER)假設(shè)用這一定制屬性所注釋的屬性的實(shí)現(xiàn)將委托給一個(gè)字段,該字段被指定為屬性定義的一部分。這使得服務(wù)器不需要在其上創(chuàng)建實(shí)例和調(diào)用行為,就可以在結(jié)構(gòu)上優(yōu)化對(duì)屬性的訪問。圖1是定義UDT的CLR類的示例性代碼清單。如圖所示,如上所述,已經(jīng)用SqlUdtField()和SqlUdtProperty()用戶屬性來注釋CLR類。具體地說,已經(jīng)在第5、8、37和49行添加SqlUdtField()用戶屬性,以分別注釋示例性UDT類定義的各個(gè)字段。已經(jīng)在第ll和24行添加SqlUdtProperty()用戶屬性,以分別注釋類的各個(gè)受管行為。然后,定義UDT的CLR類被編譯成動(dòng)態(tài)鏈接庫(dll)。然后,使用下列T-SQL腳本命令,可以創(chuàng)建包含所編譯的類的匯編createassemblytestfrom'c:\test.dll,go然后,可以使用下列T-SQL腳本命令在服務(wù)器上創(chuàng)建UDT:createtypeBaseltemexternalname:[Baseltem]go一旦已經(jīng)在服務(wù)器上創(chuàng)建UDT,可以創(chuàng)建一個(gè)將其屬性定義為UDT類型的表(例如,"MyTable"),如下createtableMyTable(ItemBaseltem,Itemldasitem::ID)go可以將一個(gè)新條目添加到表中,如下declare@iBaseltemset@i=convert(Baseltem,")insertintoMyTablevalues(@i)go然后,UDT表達(dá)式可以用于査詢中,如SELECTItem.ID、Item.NameFROMMyTable。借助于將CLR集成到SQLSERVER以及從受管代碼中的類定義中定義UDT的能力,應(yīng)用程序現(xiàn)在可以將由受管代碼類定義的類型的對(duì)象實(shí)例化,并將這些對(duì)象在關(guān)系數(shù)據(jù)庫存儲(chǔ)中作為UDT持久保存。而且,定義UDT的類也可以包括在那一類型的對(duì)象實(shí)現(xiàn)特定行為的方法。因此應(yīng)用程序可以將被定義為UDT的類型的諸對(duì)象實(shí)例化,并可以調(diào)用它們的受管行為。當(dāng)已經(jīng)被定義為UDT的類的對(duì)象在CLR中被實(shí)例化時(shí),該對(duì)象可以在對(duì)象序列化(serialization)的過程中被持久保存在數(shù)據(jù)庫存儲(chǔ)中,其中類變量的值被傳輸?shù)轿锢泶鎯?chǔ)器(如硬盤)。圖2例示將內(nèi)存中的對(duì)象序列化為其在磁盤上的持久保存的形式。圖3中所例示的格式的傳統(tǒng)關(guān)系數(shù)據(jù)庫表中,該對(duì)象可以持久保存在數(shù)據(jù)庫存儲(chǔ)中。如圖所示,該表包括一列指定的UDT。指定UDT的持久保存的對(duì)象的序列化值占用UDT列的一個(gè)單元格。再次參見圖2,當(dāng)應(yīng)用程序產(chǎn)生包括謂詞或表達(dá)式的查詢時(shí)一一該謂詞或表達(dá)式引用UDT對(duì)象的受管行為,而該UDT對(duì)象己經(jīng)被持久保存在數(shù)據(jù)庫存儲(chǔ)中(例如,返回該UDT對(duì)象的一個(gè)字段值的行為)一一所持久保存的對(duì)象必須被反序列化(de-serialize)(有時(shí)也稱為"水合(hydrating)"),并且CLR必須為整個(gè)對(duì)象分配內(nèi)存以接收其所存儲(chǔ)的值。然后,CLR必須調(diào)用返回(諸)值的UDT類的實(shí)際方法(即,行為),其中(諸)值是査詢主題。正如在上述的一起待批的序列號(hào)為_(代理記錄號(hào)MSFT-2852/306819.1)的申請(qǐng)中所描述的那樣,UDT的CLR類定義中的SqlUdtField()和SqlUdtProperty()注釋可以被數(shù)據(jù)庫服務(wù)器使用,以使得也允許對(duì)特定UDT字段的值進(jìn)行直接結(jié)構(gòu)訪問而不需要對(duì)象水合(hydration)??蓴U(kuò)展標(biāo)記語言(extensibleMarkupLanguage,XML)是一種經(jīng)萬維網(wǎng)聯(lián)盟(WorldWideWeb,W3C)認(rèn)可的用于文檔和數(shù)據(jù)表示的標(biāo)準(zhǔn),提供用人可讀的標(biāo)簽標(biāo)記數(shù)據(jù)的通用語法。XML沒有固定的標(biāo)簽組,并因此允許用戶定義這類標(biāo)簽,只要它們符合XML標(biāo)準(zhǔn)即可。數(shù)據(jù)可以在XML文檔中被存儲(chǔ)為被文本標(biāo)記所包圍的文本字符串。W3C已經(jīng)編寫出在被稱為XML信息集(XMLInfoset)的規(guī)范中的XML抽象數(shù)據(jù)模型。XML模式也可以用于將一種結(jié)構(gòu)應(yīng)用于XML格式和內(nèi)容。對(duì)于XML模式的情況,可以定義用于文檔中XML數(shù)據(jù)的圖表、計(jì)劃或框架。盡管XML是一種廣為人知的格式,可以容易地描述文檔的內(nèi)容,但是在同一個(gè)數(shù)據(jù)庫中也需要其他非XML格式的數(shù)據(jù)。這就由于固有的不兼容性而產(chǎn)生了潛在的査詢問題。這種不兼容性的一個(gè)例子是XML內(nèi)容出現(xiàn)在關(guān)系數(shù)據(jù)庫中?,F(xiàn)有的數(shù)據(jù)庫管理系統(tǒng)提供對(duì)在關(guān)系數(shù)據(jù)庫存儲(chǔ)中存儲(chǔ)XML數(shù)據(jù)的支持。例如,微軟的SQLSERVER提供對(duì)XML數(shù)據(jù)類型列、變量和參數(shù)的支持??梢杂靡粋€(gè)或多個(gè)XML列創(chuàng)建一個(gè)表、將XML值存儲(chǔ)到XML列、用XML模式命名空間定義XML列的類型、索引XML列以及査詢XML值。然而,盡管過去已經(jīng)可以將XML數(shù)據(jù)存儲(chǔ)到這些實(shí)例中的關(guān)系數(shù)據(jù)庫,但還需要可以在用受管代碼創(chuàng)建的用戶定義類型的字段中嵌入XML數(shù)據(jù)。本發(fā)明提供這一能力。(3)
發(fā)明內(nèi)容本發(fā)明涉及在用戶定義類型(UDT)的字段中存儲(chǔ)XML數(shù)據(jù)的系統(tǒng)和方法。一個(gè)或多個(gè)UDT字段可以被定義為XML數(shù)據(jù)類型;UDT也可以有其他非XML字段。符合XML數(shù)據(jù)模型的數(shù)據(jù)可以存儲(chǔ)在XML字段中,而非XML數(shù)據(jù)存儲(chǔ)在非XML字段中。因此,XML數(shù)據(jù)模型的屬性一一例如文檔順序或文檔結(jié)構(gòu)_—被保存在UDT的實(shí)例中。而且,表示對(duì)象行為(即,可以對(duì)受管代碼中的對(duì)象調(diào)用的方法)的代碼可以被添加到UDT,以便于對(duì)UDT的XML字段和非XML字段進(jìn)行操作。這使得可以使用一個(gè)框架將業(yè)務(wù)邏輯添加到具有XML標(biāo)記的半結(jié)構(gòu)化數(shù)據(jù)中。另外,可任選地,XML數(shù)據(jù)的內(nèi)容模型可以用與UDT的XML字段關(guān)聯(lián)的XML模式文檔描述。進(jìn)一步,根據(jù)本發(fā)明,為在UDT中引入的XML字段,提供公共語言運(yùn)行時(shí)間(commonlanguageruntime,CLR)編程模型,該模型將該XML字段揭示為合適的CLR類型。更適宜地,這被建模為一個(gè)名為SqlXml的類。對(duì)于一個(gè)XML數(shù)據(jù)類型字段,SqlXml成員允許在SqlUDTField注釋中有一個(gè)名為"XmlSchemaCollection"的新屬性。SqlXml類可用于服務(wù)器中ADO.net對(duì)XML數(shù)據(jù)類型的訪問。從下面的本發(fā)明具體實(shí)施方式和附圖可以明顯看出本發(fā)明的其他特征和優(yōu)點(diǎn)。(4)結(jié)合附圖一起閱讀,可以更好地理解前面的
發(fā)明內(nèi)容和下面的本發(fā)明具體實(shí)施方式。為了例示本發(fā)明,在附圖中示出本發(fā)明各個(gè)方面的示例性實(shí)施例;然而,本發(fā)明不限于所揭示的特定方法和手段。附圖中圖1是例示用于用戶定義類型的受管代碼類定義的示例性代碼片段;圖2是一個(gè)框圖,例示用戶定義類型的實(shí)例的序列化和反序列化(deserialization),該用戶定義類型已經(jīng)在受管代碼中實(shí)例化;圖3例示一個(gè)數(shù)據(jù)庫表,其中已經(jīng)持久保存的用戶定義類型的對(duì)象;圖4是一個(gè)表,例示根據(jù)本發(fā)明的一個(gè)實(shí)施例的SqlXml類的成員;圖5是根據(jù)本發(fā)明的一個(gè)實(shí)施例的、具有SqlXml字段的CLR類"Employee"的示例性程序代碼清單;圖6是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何用.net編程語言創(chuàng)建Employee類的一個(gè)新實(shí)例并填充它的示例性程序代碼清單;圖7是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何從Employee類獲得一用于分析XML內(nèi)容的XmlReader的示例性程序代碼清單;圖8是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何用.net編程語言更新Employee類的實(shí)例的示例性程序代碼清單;圖9是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,說明使用"XmlSchemaCollection"屬性的示例性程序代碼清單;圖10是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何在客戶機(jī)獲得XML內(nèi)容的有效性的示例性程序代碼清單;圖11是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何從類定義獲得"XmlSchemaCollection"屬性中指定的XML模式集合名的示例性程序代碼清單;圖12是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,一旦知道XML模式集合名,如何從服務(wù)器檢索XML模式集合的示例性程序代碼清單;圖13是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何獲得驗(yàn)證XmlReader的示例性程序代碼清單;圖14是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何用客戶機(jī)驗(yàn)證執(zhí)行更新的示例性程序代碼清單;圖15是例示根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何能將一行為添加到CLR類的示例性代碼清單,該CLR類定義UDT以便于在UDT數(shù)據(jù)字段上實(shí)現(xiàn)該行為;圖16是表示本發(fā)明可以在其中實(shí)現(xiàn)的、具有多種計(jì)算設(shè)備的示例性網(wǎng)絡(luò)環(huán)境的框圖;以及圖17是表示本發(fā)明可以在其中實(shí)現(xiàn)的示例性計(jì)算設(shè)備的框圖。(5)具體實(shí)施例方式結(jié)合特征描述本發(fā)明的主題,以滿足法定的要求。然而,描述本身并不意味著限制這一專利權(quán)的范圍。然而,發(fā)明者已經(jīng)考慮到所要求的主題也可以結(jié)合其他當(dāng)前或?qū)淼募夹g(shù)以其他方式實(shí)現(xiàn),以包括與在本文檔中所描述的步驟或元素相類似的步驟或元素。而且,盡管在此使用術(shù)語"步驟"表示所用方法的不同方面,但該術(shù)語不應(yīng)該被解釋為暗示此處所公開的不同步驟之中或之間有任何特定順序,除非明確描述個(gè)別步驟的順序。如上所述,本發(fā)明涉及在用戶定義類型(UDT)的字段中存儲(chǔ)XML數(shù)據(jù)的系統(tǒng)和方法。UDT的字段可以被定義為XML數(shù)據(jù)類型;UDT也可以具有其他非XML字段。符合XML數(shù)據(jù)模型的數(shù)據(jù)可以存儲(chǔ)在XML字段中,而非XML數(shù)據(jù)存儲(chǔ)在非XML字段中。因此,XML數(shù)據(jù)模型的屬性一一例如文檔順序和文檔結(jié)構(gòu)一一被保存在UDT的實(shí)例中。而且,表示對(duì)象行為(即,可以對(duì)受管代碼中的對(duì)象調(diào)用的方法)的代碼可以被添加到UDT,以便于對(duì)UDT的XML字段和非XML字段進(jìn)行操作。這使得可以使用一個(gè)框架將業(yè)務(wù)邏輯添加到半結(jié)構(gòu)化數(shù)據(jù)中。另外,可任選地,XML數(shù)據(jù)的內(nèi)容模型可以使用與UDT的XML字段關(guān)聯(lián)的XML模式文檔描述。進(jìn)一步,根據(jù)本發(fā)明,為在UDT中引入的XML字段,提供公共語言運(yùn)行時(shí)間(commonlanguageruntime,CLR)編程模型,該模型將該XML字段揭示為合適的CLR類型。更適宜地,這被建模為一個(gè)名為SqlXml的類。對(duì)于一個(gè)XML數(shù)據(jù)類型字段,SqlXml成員在SqlUDTField注釋中提供一個(gè)名為"XmlSchemaCollection"的新屬性。SqlXml類可用于服務(wù)器中ADO.net對(duì)XML數(shù)據(jù)類型的訪問。SqlXml類根據(jù)本發(fā)明的一個(gè)方面,定義一個(gè)新類以支持在CLR類的字段中存儲(chǔ)XML數(shù)據(jù)。在本實(shí)施例中,該類被稱為SqlXml,應(yīng)該理解,特定名稱對(duì)本發(fā)明并不重要。圖4是描述SqlXml類成員的表。如圖4所示,SqlXml類支持兩個(gè)構(gòu)造函數(shù)。一個(gè)構(gòu)造函數(shù)接收其輸入中的XmlReader。XmlReader是一個(gè)定義對(duì)XML數(shù)據(jù)的快速、非緩存、僅前向讀取訪問的Microsoft.net框架抽象類(或接口)。當(dāng)一個(gè)SqlXml對(duì)象從數(shù)據(jù)流的XmlReader、另一個(gè)SqlXml實(shí)例或任何其中具有XmlReader的類被實(shí)例化時(shí),這一構(gòu)造函數(shù)是有用的。由于通過XmlReader接口讀取XML內(nèi)容,作為構(gòu)造函數(shù)的一部分,進(jìn)行格式正確性檢查。另一個(gè)構(gòu)造函數(shù)接收數(shù)據(jù)流作為輸入,在構(gòu)造函數(shù)中跳過格式正確性檢査時(shí)使用。也可以使用其他構(gòu)造函數(shù)。CreateReader()方法返回XmlReader,通過XmlReader檢索SqlXml的(XML)內(nèi)容。對(duì)XmlReader的支持提供了XML內(nèi)容上非常靈活的機(jī)制。例如,XPathDocument或XPathNavigator可以在來自服務(wù)器XML數(shù)據(jù)類型的值上被實(shí)例化。SqlXml類是無記憶的,允許提供同時(shí)的CreateReader()調(diào)用。多個(gè)CreateReader()調(diào)用返回XmlReader的不同實(shí)例。每個(gè)這樣的實(shí)例被初始化到由SqlXml對(duì)象封裝的XML內(nèi)容的開始。這允許將SqlXml實(shí)例傳給可以在其中創(chuàng)建XML讀取器的新實(shí)例的函數(shù)和過程。為更新SqlXml成員M的值,XmlWriter被用來寫入一數(shù)據(jù)流、實(shí)例化數(shù)據(jù)流上的XmlReader以及實(shí)例化來自XmlReader或數(shù)據(jù)流的新的SqlXml對(duì)象Ml。XmlWriter是定義產(chǎn)生(寫)包含XML數(shù)據(jù)的數(shù)據(jù)流或文件的快速、非緩存、僅前向方式的.net框架抽象類(或接口),該XML數(shù)據(jù)符合W3C可擴(kuò)展標(biāo)記語言(ExtensibleMarkupLanguage,XML)1.0以及XML推薦標(biāo)準(zhǔn)中的命名空間。XmlTextWritter是實(shí)現(xiàn)XmlWriter接口的.net框架類。下列XML字符串〈rootxmlns:x=〃urn:1"><x:item/><x:item/></x:root>可以由下列Cft代碼片段創(chuàng)建-XmlTextWriterw=newXmlTextWriter();w.WriteAttributeString(〃xmlns〃,〃x〃,null,〃urn:l〃);w.WriteStartElement(〃item〃,〃urn:1〃);w.WriteEndElement();w.WriteStartElement(〃item〃,〃urn:1〃);w.WriteEndElement();w.WriteEndElement0;于是,SqlXml對(duì)象Ml被指定給M。這就將源對(duì)象Ml的當(dāng)前狀態(tài)復(fù)制到M。也可以使用SqlXml上的其他可以用來更新XML內(nèi)容的方法,例如返回XmlWriter對(duì)象的CreateWriter()。在CLR類中使用SqlXml進(jìn)一步根據(jù)本發(fā)明的本實(shí)施例,CLR類的一個(gè)或多個(gè)成員可以被定義為新的SqlXml類型。支持SqlXml的本地CLR類型是一種提供可以從中獲得XmlReader的數(shù)據(jù)流的類型。該數(shù)據(jù)流不能直接被訪問,只能通過XmlReader被訪問。它也支持兩個(gè)構(gòu)造函數(shù),其中一個(gè)接收XmlReader,另一個(gè)接收數(shù)據(jù)流。圖5是具有SqlXml字段的CLR類"Employee"的示例性程序代碼清單。如圖所示,Employee類有一些映射到服務(wù)器的基本SQL類型的"sqltypes"成員。Resume成員具有SqlXml類型。它由服務(wù)器的XML數(shù)據(jù)類型和CLR中的數(shù)據(jù)流支持。在兩種情況中,XML內(nèi)容都可以通過XmlReader訪問。用S。lXml字段創(chuàng)建用戶定義類型正如上面
背景技術(shù):
中所描述的那樣,為了用.net編程語言從受管類創(chuàng)建SQL中的用戶定義類型,用戶首先用CREATEASSEMBLY語句登記包含類型定義的匯編。然后,使用CREATETYPE語句創(chuàng)建用戶定義類型,如下所示CREATETYPE[type-schema-name].udt-nameEXTERNALNAMEassembly-name[:class-name]根據(jù)本發(fā)明,SQL用戶定義類型udt-name可以有一個(gè)或多個(gè)(無類型)XML數(shù)據(jù)類型的字段X1、X2、…,對(duì)應(yīng)于UDT的CLR類C中的SqlXml字段M1、M2、…。以通常方式執(zhí)行將類型udt-name的實(shí)例序列化和反序列化為類C,正如上所描述以及在圖2中所例示的那樣。在這種情況中,創(chuàng)建類型的所有通用規(guī)則都有效。udt-name中的XML字段在名為binaryXML的內(nèi)部表示中被存儲(chǔ)為大二進(jìn)制SQL類型。一旦用戶定義類型已經(jīng)被創(chuàng)建,它可以在表或視圖中作為列類型以及SQL變量和參數(shù)使用,就像任何沒有XML字段的用戶定義類型那樣。作為例子,創(chuàng)建基于上面所定義的Employee類的、名為udtEmp的UDT,如下所示CREATETYPEudtEmpEXTERNALNAMEmyAssembly:EmployeeudtEmpUDT將具有用于fName和IName的類型nvarchar(4000)、用于Age字段的浮點(diǎn)型等等的字段。類Employee的SqlXml成員Resume被映射到udtE卿中的無類型(即,沒有任何XML模式關(guān)聯(lián))XML數(shù)據(jù)類型字段Resume。雇員(employee)表tabEmployee可以用整數(shù)歹UID禾口udtEmp歹ljEmployee創(chuàng)建,如下所示CREATETABLEtabEmployee(IDinteger,udtEmpEmpCol)表的創(chuàng)建建立了在用戶定義類型udtEmp上的模式綁定。通過提供這兩列的值,可以將諸行插入到表tabEmployee中。檢查被插入到EmpCol的Resume字段中的XML值,以保證插入時(shí)的正確格式。在實(shí)例層,利用存儲(chǔ)在字段EmpCol.Resume中的SqlXml成員Employee.Res咖e,Employee對(duì)象被序列化為udtEmp的實(shí)例。反之,利用被力口載到Employee.Resume成員的EmpCol.Resume字段值,EmpCol的實(shí)例被反序列化為Employee對(duì)象。作為進(jìn)一步的例子,假設(shè)執(zhí)行下列T-SQL語句SELECTEmpCol.ResumeFROMtabEmployee在語義上,(類型udtEmp的)列EmpCol中的每個(gè)值都在CLR中被序列化為類型Employee的對(duì)象。尤其,以XML數(shù)據(jù)類型被返回給T-SQL層的XML數(shù)據(jù)類型字段EmpCol.Resume被加載到SqlXml成員Employee,Resume。一種優(yōu)化是直接提取出EmpCol.Resume的值,避免用于提取E即loyee.Resume成員值的反序列化。圖6是例示如何用.net編程語言創(chuàng)建Employee類的新實(shí)例并填充它的示例性程序代碼清單。在這個(gè)例子中,新的Employee對(duì)象被創(chuàng)建。以一般方式給它的非XML字段賦值。對(duì)于XML字段Resume,在字符串值("XMLcontenthere")上創(chuàng)建XmlTextReader讀取器。然后,新的SqlXml對(duì)象在讀取器中被實(shí)例化,并被賦值給Resume字段。如上所述,XmlTextReader是實(shí)現(xiàn)XmlReader接口的.net框架類。使用XmlReader,將XML內(nèi)容復(fù)制到Res咖e字段的內(nèi)部存儲(chǔ)中。通過讀取器的檢索引起對(duì)XML內(nèi)容的格式正確性檢查。任何可以從中獲得XmlReader的對(duì)象都有這樣的能力。因此,可以從文件讀取或從其他SqlXml實(shí)例獲取XmlReader。圖7是例示如何從Employee類的實(shí)例獲得XML內(nèi)容以分析該XML內(nèi)容的示例性程序清單。在該清單中,Emp.Resume.CreateReader()返回一可以從中檢索XML內(nèi)容的(非驗(yàn)證的)XmlReader。對(duì)象readerl和reader2被初始化到XML內(nèi)容的開始。它們不相互依賴,這是因?yàn)镾qlXml是無記憶的。圖8是例示如何用.net編程語言更新Employee類的實(shí)例的程序代碼清單的例子。以一般方式更新Employee對(duì)象Emp的非XML字段。新的XML內(nèi)容("newXMLcontenthere")被寫入數(shù)據(jù)流,在數(shù)據(jù)流上構(gòu)造XmlReader讀取器,并在讀取器中構(gòu)造新的SqlXml對(duì)象。所構(gòu)造的SqlXml對(duì)象被賦值給相應(yīng)的字段Emp.Res咖e。這使得XML內(nèi)容被復(fù)制到Emp.Resume中。這是"盲"寫入的一個(gè)例子。對(duì)于增量更新,應(yīng)用程序可以從Emp.Resume獲得XML讀取器、從中讀取并將更新后的內(nèi)容寫入XML書寫器。更新內(nèi)容以Emp.Resume的當(dāng)前內(nèi)容以及對(duì)它所作的修改(例如,添加一個(gè)新的電話號(hào)碼)為基礎(chǔ)。有類型的XML根據(jù)本發(fā)明的一個(gè)進(jìn)一步的方面,可以將UDT中的XML字段綁定到服務(wù)器的XML模式集合。XML模式集合是SQLSERVER中的新概念,允許將與不同的XML模式相關(guān)聯(lián)的數(shù)據(jù)實(shí)例存儲(chǔ)在關(guān)系數(shù)據(jù)庫的相同列中。根據(jù)本發(fā)明,XML模式集合概念被擴(kuò)展到已經(jīng)定義了SqlXml的UDT的字段(即,被定義為包含XML數(shù)據(jù)的字段),如上所述。作為進(jìn)一步的背景,考慮XML模式集合,記得
背景技術(shù):
一節(jié)中提到過XML是一種用于文本文檔的元標(biāo)記語言。數(shù)據(jù)以文本字符串的形式被包括在XML文檔中,并被描述數(shù)據(jù)的文本標(biāo)記所包圍。數(shù)據(jù)和標(biāo)記的特定單位被稱為元素。XML規(guī)范定義了這類標(biāo)記必須遵循的精確語法元素如何被標(biāo)簽分隔、標(biāo)簽是什么樣式、元素可以接收什么樣的名稱、屬性位于何處等等。在允許被定義的元素方面,XML是靈活的,但在其他許多方面是嚴(yán)格的。它為XML文檔提供管理標(biāo)簽位置、標(biāo)簽在何處出現(xiàn)、什么元素名稱合法、屬性如何被附加到元素等等的語法。該語法是詳盡的,足以允許開發(fā)可以讀取并理解任何XML文檔的XML分析程序。符合這一語法的文檔被稱為是格式正確的。為增強(qiáng)互操作性,個(gè)體或組織可以約定只使用某些標(biāo)簽。這些標(biāo)簽集被稱為XML應(yīng)用。XML應(yīng)用不是像MICROSOFTWORD或MICROSOFTEXCEL那樣的軟件應(yīng)用程序。它是一標(biāo)簽組,規(guī)定用于特定目的如矢量圖形、財(cái)務(wù)數(shù)據(jù)、烹飪食譜或出版的XML增強(qiáng)功能性。XML模式是XML應(yīng)用的一種類型,即可以描述符合特定XML詞匯表的文檔的所允許內(nèi)容的XML應(yīng)用。例如,考慮圖書出版社的情況。出版社可以將XML應(yīng)用用于其商務(wù),因此當(dāng)它將數(shù)據(jù)(關(guān)于圖書、銷售、客戶等等)提供給其他出版社、作者和客戶時(shí),他們受益于由XML應(yīng)用提供的所添加的功能性,而這在行業(yè)中可以是標(biāo)準(zhǔn)的。此外,出版社可以采用一個(gè)用于圖書的XML模式,因此每當(dāng)它的計(jì)算機(jī)(及其合作伙伴的計(jì)算機(jī))訪問關(guān)于圖書的信息時(shí),他們?cè)L問的是相同的信息。該信息由XML模式配置并限定,以使得它對(duì)所有的圖書都是一致的。正如在
背景技術(shù):
中進(jìn)一步提到的那樣,關(guān)系數(shù)據(jù)庫如SQLSERVER,目前提供像存儲(chǔ)任何其他數(shù)據(jù)一樣將XML數(shù)據(jù)存儲(chǔ)到關(guān)系表中的能力。例如,表可以用一個(gè)或多個(gè)XML列創(chuàng)建,XML值可以被存儲(chǔ)在那些列中,XML列可以被索引,以及,在那些列中的XML值可以被査詢。此外,可以使用XML模式"類型化"XML列以使得該列中的XML數(shù)據(jù)值符合該模式。當(dāng)在關(guān)系數(shù)據(jù)庫中發(fā)現(xiàn)符合給定XML模式的XML數(shù)據(jù)時(shí),根據(jù)該模式的輪廓訪問該數(shù)據(jù),結(jié)果,可以有效地解釋該數(shù)據(jù)。然而當(dāng)嘗試將符合不是一個(gè)而是幾個(gè)模式的XML數(shù)據(jù)值存儲(chǔ)到關(guān)系數(shù)據(jù)庫的相同列時(shí),問題出現(xiàn)了。一個(gè)值可以是關(guān)于具有指定的圖書名稱、圖書作者、出版社、版權(quán)年份等等的一本圖書的XML數(shù)據(jù)。另一個(gè)值可以是關(guān)于具有指定的DVD名稱、男女演員、導(dǎo)演、流派、等級(jí)、發(fā)布年份等等的DVD的XML數(shù)據(jù)。假設(shè)出于數(shù)據(jù)處理效率方面的考慮(數(shù)據(jù)處理效率與對(duì)所有媒體一一即圖書和DVD——同時(shí)作出判定有關(guān)),需要將圖書和DVD都存儲(chǔ)到特定列中,就出現(xiàn)了應(yīng)該使用哪個(gè)模式理解和增強(qiáng)關(guān)于該列中XML數(shù)據(jù)的規(guī)則的問題。以前,只有符合一個(gè)模式的數(shù)據(jù)才能被存儲(chǔ)在單個(gè)列中。被用來標(biāo)識(shí)列的模式在列的頂端被標(biāo)識(shí),任何不符合所標(biāo)識(shí)模式的數(shù)據(jù)實(shí)例將引起錯(cuò)誤。通過一XML模式集合對(duì)象,允許將與多個(gè)不同模式關(guān)聯(lián)的XML數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫的相同列中,XML模式集合的新概念解決了這一問題。XML模式集合是第一類充當(dāng)XML模式命名空間容器的SQLSERVER對(duì)象。用戶可以使用XML模式集合限定XML列、參數(shù)和變量。這允許他們將符合XML模式命名空間中的任何一個(gè)XML數(shù)據(jù)實(shí)例存儲(chǔ)在限定XML模式集合中。因此,XML模式集合對(duì)象是第一類作為XML模式命名空間容器的SQL對(duì)象。在一種無限制的實(shí)現(xiàn)中,它由一個(gè)三部分名稱(threepartname)所標(biāo)識(shí)。用于XML模式集合的SQL標(biāo)識(shí)符的范圍是它在其中被創(chuàng)建的關(guān)系模式。每個(gè)XML模式集合可以包含多個(gè)XML模式命名空間統(tǒng)一資源標(biāo)識(shí)符(universalresourceidentifier,URI)。XML模式命名空間在XML模式集合對(duì)象中是唯一的,用戶可以使用XML模式集合限定XML列。這允許他們限定文檔,以防止?jié)撛跓o關(guān)的、屬于XML模式集合的XML模式。如上所述,根據(jù)本發(fā)明的一個(gè)方面,XML模式集合的概念被擴(kuò)展為UDT的字段;即是說,UDT中的XML字段可以被綁定到服務(wù)器的XML模式集合。將UDT中的XML字段綁定到服務(wù)器的XML模式集合意味著,根據(jù)XML模式集合中的一個(gè)XML模式,XML字段的每個(gè)實(shí)例都是有效的。此外,基于XML模式優(yōu)化了存儲(chǔ),而使用XML模式用于類型推斷優(yōu)化了使用XML數(shù)據(jù)類型方法的査詢。以下是用.net語言支持有類型的XML的要求。首先,類型化類成員的XML模式可以在類定義時(shí)而不是在運(yùn)行時(shí)間被指定。即是說,定義應(yīng)該是聲明的。其次,與XML讀取器關(guān)聯(lián)的XML模式集必須是動(dòng)態(tài)集。即是說,可以修改該集中的模式(例如,添加新元素,這與創(chuàng)建Windows外殼中的用戶屬性相對(duì)應(yīng))。應(yīng)該允許從模式刪除元素。同樣,新的XML模式可以被添加到模式集(例如,新安裝的應(yīng)用程序如PowerPoint將其自己的模式添加到模式集中)。另外,模式可以從模式集移除(例如,PowerPoint被卸載,使得其模式被從XML模式集合中移除)。模式也可以用新版本來替換。為支持將UDT中的XML字段綁定到服務(wù)器的XML模式集合,本發(fā)明的該實(shí)施例中,可以使用在
背景技術(shù):
一節(jié)中所討論的SqlUDTField注釋,在一SqlXml成員中指定名為"XmlSchemaCollection"的新屬性(其值為一字符串)。這一屬性的值指示有類型的UDT中相應(yīng)XML字段的、服務(wù)器的XML模式集合的名稱。這是一個(gè)一部分名稱(l-part腦e)(與多部分名稱(multipartname)相對(duì)),提供與任何數(shù)據(jù)庫及任何關(guān)系模式一起使用類定義的靈活性。在本地的CLR上下文中,SqlXml成員的SqlUDT注釋被忽略?;蛘?,它可以是一個(gè)指定了數(shù)據(jù)庫、關(guān)系模式和XML模式集合名稱的三部分名稱。在本實(shí)施例中,"XmlSchemaCollection"是SqlXml成員中被允許的唯一屬性;如果指定其他屬性,將導(dǎo)致該屬性不被允許的一般錯(cuò)誤。本文檔中允許其他屬性。指定"XmlSchemaCollection"屬性的SqlXml成員M的語法如下所示SqlXmlM;"XmlSchemaCollection"屬性不會(huì)引起將SqlXml成員M綁定到任何XML模式。如果應(yīng)用程序想要從M獲得XmlReader,它有責(zé)任將XML模式和驗(yàn)證XmlReader關(guān)聯(lián)起來。即是說,SqlXml類繼續(xù)提供M的非驗(yàn)證XmlReader而不是驗(yàn)證XralReader,盡管出現(xiàn)了"XmlSchemaCollection"屬性?;蛘?,屬性可以引起XML模式綁定并返回一驗(yàn)證讀取器。被指定為"XmlSchemaCollection"屬性值的、名為"XML-Schema-Collection-Name"的XML模式集合必須存在于服務(wù)器元數(shù)據(jù)中0尤其,它必須存在于與UDTudt-name在其中被創(chuàng)建的關(guān)系模式相同的關(guān)系模式中。在來自u(píng)dt-name的"XML-Schema-Collection-Name"上建立模式綁定。如果XML-Schema-Collection-Name不存在,CREATETYPE語句就無法創(chuàng)建用戶定義類型udt-name。在本實(shí)施例中,具有相同的"XmlSchemaCollection"屬性值的兩個(gè)SqlXml成員共享服務(wù)器的XML模式集合。這允許應(yīng)用程序優(yōu)化存儲(chǔ)。更一般的設(shè)計(jì)是,允許XML模式集合可以在多個(gè)程序集的多個(gè)類的多個(gè)成員中被共享。CLR類的實(shí)例被以一般方式序列化以供所有類成員使用,包括具有"XmlSchemaCollection"屬性規(guī)范的SqlXml成員。這些SqlXml成員被存儲(chǔ)在UDT實(shí)例中的有類型的XML字段中;針對(duì)XML模式集合的驗(yàn)證在插入和數(shù)據(jù)修改期間發(fā)生。對(duì)于UDT序列化,只有每個(gè)SqlXml成員的XML內(nèi)容才被序列化;XralSchemaSet中的XML模式?jīng)]有被序列化。XML模式必須分別地添加到服務(wù)器的XML模式集合或從其中移除。在反序列化過程中,UDT字段被加載到CLR類的相應(yīng)成員中。對(duì)于有類型的XML字段,實(shí)例數(shù)據(jù)被公開為SqlXml對(duì)象。不使用關(guān)聯(lián)的XML模式集合。用戶可以將XML模式集合加載到客戶機(jī)的XmlSchemaSet對(duì)象中,正如下面所討論的那樣。圖9是例示使用"XmlSchemaCollection"屬性的程序代碼清單的例子。圖9中的定義假設(shè)需要類型化用戶定義類型udtTypedEmp中的XML字段"Resume"。SqlUDTField注釋指定服務(wù)器的XML模式集合名稱"myEmployeeSchema",該XML模式集合名稱類型化與UDT中TypedEmployee.TypedResume相對(duì)應(yīng)的XML字段。下列操作序列被用來創(chuàng)建具有有類型的XML字段的UDT:(1)創(chuàng)建XML模式集合CREATEXMLSCHEMACOLLECTIONmyEmployeeSchemaAS'〈xs:schemaxmlns=〃book〃>...</xs:schema>,(2)創(chuàng)建CLR類TypedEmployee(3)創(chuàng)建該匯編(4)創(chuàng)建用戶定義類型udtTypedE即loyee用戶定義類型udtTypedEmployee被創(chuàng)建時(shí),XML模式集合myEmployeeSchema必須存在于服務(wù)器中;否則,無法創(chuàng)建用戶定義類型。XML模式驗(yàn)證在本實(shí)施例中,當(dāng)通過驗(yàn)證XmlReader檢索XML內(nèi)容或用驗(yàn)證XmlWriter寫入XML內(nèi)容時(shí),XML模式文件(XMLSchemaDocument,XSD)驗(yàn)證可以在客戶機(jī)發(fā)生。本實(shí)施例中,在服務(wù)器處,當(dāng)UDT實(shí)例被插入列中或被更新時(shí),XSD驗(yàn)證發(fā)生。因此在本實(shí)施例中,當(dāng)新的SqlXml對(duì)象在非驗(yàn)證XmlReader中被構(gòu)造并被分配給具有所指定的"XmlSchemaCollection"屬性的SqlXml成員時(shí),XSD驗(yàn)證不發(fā)生。作為進(jìn)一步的例子,開發(fā)者或其他用戶可能想要?jiǎng)?chuàng)建沒有客戶機(jī)驗(yàn)證的TypedEmployee類的新實(shí)例。在這種情況中,程序代碼與用于沒有SqlUdt注釋的SqlXml成員的程序代碼(見圖6)完全相同。然而,如果需要在客戶機(jī)驗(yàn)證XML內(nèi)容,可以以圖10中的示例性程序代碼清單中所例示的方式實(shí)現(xiàn)。這種情況不同于沒有客戶機(jī)認(rèn)證的情況,XmlSchemaSetmySchemaSet被創(chuàng)建并填充,并被用來在數(shù)據(jù)流上創(chuàng)建驗(yàn)證XmlWritervalWtr。根據(jù)mySchemaSet驗(yàn)證通過valWtr所寫的XML內(nèi)容。從數(shù)據(jù)流獲得的非驗(yàn)證XmlReader讀取器被用來構(gòu)造SqlXml的新實(shí)例,用于分配給newEmp.TypedRes咖e。應(yīng)該理解,有其他編寫代碼的方法。例如,對(duì)于客戶機(jī)驗(yàn)證可以使用驗(yàn)證讀取器而不是驗(yàn)證書寫器。根據(jù)XML模式驗(yàn)證的另一個(gè)方面,在本實(shí)施例中,可以從類定義獲得在"XmlSchemaCollection"屬性中所指定的XML模式集合名稱。圖11的示例性程序代碼清單例示這是如何實(shí)現(xiàn)的。如圖所示,沒有除了"XmlSchemaCollection"屬性之外的XML特性。一旦從類定義知道圖11中所例示的XML模式集合名稱,就可以從服務(wù)器檢索XML模式集合以填充XmlSchemaSet對(duì)象。這一對(duì)象被用于創(chuàng)建驗(yàn)證XmlReader或XmlWriter。圖12的示例性程序代碼清單描述了這一機(jī)制。從服務(wù)器檢索XML模式集合要求數(shù)據(jù)庫連接。對(duì)于進(jìn)程內(nèi)的提供者,從SqlContext對(duì)象獲得數(shù)據(jù)庫連接。對(duì)于進(jìn)程外的提供者,應(yīng)用程序提供該連接(不同于檢索數(shù)據(jù)所用的連接)。使用指定的XML模式集合名稱作為參數(shù),在目錄視圖上執(zhí)行SQL語句。內(nèi)部函數(shù)XML—SCHEMA—COLLECTION()被用于檢索XML數(shù)據(jù)類型列中的被反序列化為SqlXml類的模式文檔。借助于從SQlXffll對(duì)象獲得的XmlReader,每個(gè)模式文檔被添加到XmlSchemaSet對(duì)象。為了從SqlXml成員TypedEmployee.TypedResume獲得非驗(yàn)證讀取器,程序代碼與用于沒有SqlUdt注釋的SqlXml成員的程序代碼(見圖7)相同。圖13是例示如何獲得驗(yàn)證XmlReader的示例性程序代碼清單。在這個(gè)例子中,通過從SqlXml成員TypedEmployee.TypedResume獲得的非驗(yàn)證讀取器nonValRdr創(chuàng)建驗(yàn)證XmlReadervalRdr。在從valRdr讀出任何信息之前,添加XralSchemaSet對(duì)象mySchemaSet。驗(yàn)證類型被指定為XSD。此時(shí)可以通過驗(yàn)證讀取器讀取所驗(yàn)證的內(nèi)容。在本實(shí)施例中,當(dāng)更新現(xiàn)有的XML值時(shí),可以使用與用于沒有SqlUdt注釋的SqlXml成員的代碼相同的代碼更新SqlXml成員而不需要客戶機(jī)驗(yàn)證(見圖8)。圖14的示例性程序代碼清單例示如何使用客戶機(jī)驗(yàn)證執(zhí)行更新。從服務(wù)器到XmlSchemaSet對(duì)象mySchemaSet中檢索XML模式集合。這被用來創(chuàng)建數(shù)據(jù)流中的驗(yàn)證XmlWritervalWtr。將XML內(nèi)容寫入valWtr,從數(shù)據(jù)流獲得非驗(yàn)證XmlReader讀取器,給TypedEmp.TypedResume分配從讀取器構(gòu)造的新的SqlXml對(duì)象。UDT中的XML字段的處理進(jìn)一步,根據(jù)本發(fā)明,可以查詢和更新UDT的XML字段。例如,可以到雇員(employee)表tabEmployee的XML字段Res咖e中查詢(參見上面的例子),如下所示SELECTEmpCol.Resume,query(V/Education,)FROMtabEmployeeWHEREEmpCol.AnnualSalary()>40000ANDEmpCol.fName='John'ANDEmpCol.Resume,value(V/Address/ZipCode,,"int,)二98052表達(dá)式EmpCol.Resume產(chǎn)生UDT中的XML數(shù)據(jù)類型字段,因此,XML數(shù)據(jù)類型中的"query"和"value"函數(shù)可以用于下鉆(drilldown)入XML實(shí)例中。以一般方式訪問非XML字段。該查詢也示出在用戶定義類型udtEmp的函數(shù)AnnualSalary()的調(diào)用。作為更新的例子,假設(shè)名為"John"的雇員的郵政編碼改變?yōu)?8052。該更新可以用下列語句實(shí)現(xiàn)UPDATEtabEmployeeSETEmpCol.Resume,modify('Update//ZipCodeto98052,)WHEREEmpCol.fname='John'如前所述,本發(fā)明提供用于建模全都在用戶定義類型(UDT)的單個(gè)實(shí)例中的結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)的框架和方法。尤其,本發(fā)明將XML數(shù)據(jù)模型擴(kuò)展到UDT的字段。因此,XML數(shù)據(jù)的特性_一如文檔次序和文檔結(jié)構(gòu)一一可以被保存在UDT實(shí)例中。正如上面所進(jìn)一步描述的那樣,可任選地,可以使用與UDT的XML字段關(guān)聯(lián)的XML模式文檔描述XML數(shù)據(jù)的內(nèi)容模型。而且,表示對(duì)象行為(即,可以被用受管代碼創(chuàng)建的對(duì)象調(diào)用的方法)的代碼可以被添加到UDT,以便于對(duì)UDT的XML字段和非XML字段進(jìn)行操作。這提供用于將業(yè)務(wù)邏輯添加到XML數(shù)據(jù)的框架。圖15是示例性代碼清單,例示行為如何被添加到CLR類,該CLR類定義UDT以便于在被定義為類型SqlXml的字段上實(shí)現(xiàn)行為。在這一例子中,根據(jù)所指定的可擴(kuò)展樣式表語言(eXstensibleStylesheetLanguage,XSL)文件添加變換Resume(XML)數(shù)據(jù)的行為。如上所述,該行為由已經(jīng)被添加到類Employee的方法TransformXml實(shí)現(xiàn)。所變換的值被返回為XML數(shù)據(jù)類型SqlXml。正如在圖底部的SQL語句所示出的那樣,可以在從Employee類產(chǎn)生的UDT的實(shí)例中調(diào)用這一方法。因此,正如在這個(gè)例子中所說明的那樣,可以在包含XML數(shù)據(jù)的UDT字段中實(shí)現(xiàn)行為。事實(shí)上,可以實(shí)現(xiàn)的行為實(shí)際上是無限的,這就提供了用于將業(yè)務(wù)邏輯添加到XML數(shù)據(jù)的有力工具。從上面可以明顯看出,本發(fā)明的各種系統(tǒng)、方法和方面的全部或部分可以在硬件、軟件或兩者的組合中實(shí)現(xiàn)。當(dāng)在軟件中實(shí)現(xiàn)時(shí),本發(fā)明的方法和裝置或其中特定的方面或部分可以實(shí)現(xiàn)為程序代碼(如指令)的形式。該程序代碼可以被存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)如磁、電或光存儲(chǔ)介質(zhì)中,包括但不限于軟盤、CD-ROM、CD-RW、DVD-ROM、DVD-RAM、磁帶、閃速存儲(chǔ)器、硬盤驅(qū)動(dòng)器或任何其他機(jī)器可讀的存儲(chǔ)介質(zhì),其中,當(dāng)程序代碼被機(jī)器(如計(jì)算機(jī)或服務(wù)器)加載和執(zhí)行時(shí),該機(jī)器就變成實(shí)施本發(fā)明的裝置。程序代碼在其中執(zhí)行的計(jì)算機(jī)一般包括處理器、處理器可讀的存儲(chǔ)介質(zhì)(包括易失性和非易失性存儲(chǔ)器和/或存儲(chǔ)元件)、至少一個(gè)輸入設(shè)備以及至少一個(gè)輸出設(shè)備。程序代碼可以用高級(jí)面向過程的或面向?qū)ο蟮木幊陶Z言實(shí)現(xiàn)。或者,程序代碼可以用匯編或機(jī)器語言實(shí)現(xiàn)。無論如何,語言可以是編譯或解釋語言。本發(fā)明也可以實(shí)現(xiàn)為通過傳輸介質(zhì)所傳輸?shù)某绦虼a的形式,如通過電線或電纜、光纖、網(wǎng)絡(luò)(包括局域網(wǎng)、廣域網(wǎng)、因特網(wǎng)或企業(yè)內(nèi)部互聯(lián)網(wǎng))或任何其他形式的傳輸,其中,當(dāng)程序代碼被機(jī)器(如計(jì)算機(jī))接收并加載及執(zhí)行時(shí),該機(jī)器就變成實(shí)施本發(fā)明的裝置。當(dāng)在通用處理器上實(shí)現(xiàn)時(shí),程序代碼可以與處理器結(jié)合,以提供獨(dú)特的可以像專用邏輯電路那樣工作的裝置。而且,本發(fā)明可以和部署為計(jì)算機(jī)網(wǎng)絡(luò)的一部分或部署在分布式的計(jì)算環(huán)境中的任何計(jì)算機(jī)或其他客戶機(jī)或服務(wù)器設(shè)備一起實(shí)現(xiàn)。在這點(diǎn)上,本發(fā)明涉及具有任意數(shù)量的存儲(chǔ)器或存儲(chǔ)單元和在任意數(shù)量的存儲(chǔ)單元或巻上出現(xiàn)的任意數(shù)量的應(yīng)用程序及進(jìn)程的任何計(jì)算機(jī)系統(tǒng)或環(huán)境,它們可以和用于根據(jù)本發(fā)明將對(duì)象持久保存在數(shù)據(jù)庫存儲(chǔ)中的進(jìn)程一起使用。本發(fā)明可以應(yīng)用于具有服務(wù)器計(jì)算機(jī)和客戶機(jī)計(jì)算機(jī)的環(huán)境中,其中,服務(wù)器計(jì)算機(jī)和客戶機(jī)計(jì)算機(jī)部署在網(wǎng)絡(luò)環(huán)境或分布式計(jì)算環(huán)境中,具有遠(yuǎn)程和本地存儲(chǔ)器。本發(fā)明也可以應(yīng)用于獨(dú)立的計(jì)算設(shè)備,其中,獨(dú)立計(jì)算設(shè)備具有用于與遠(yuǎn)程或本地服務(wù)有關(guān)的產(chǎn)生、接收和傳輸信息的編程語言功能性、解釋和執(zhí)行能力。分布式計(jì)算通過在計(jì)算設(shè)備和系統(tǒng)之間進(jìn)行交換方便了計(jì)算機(jī)資源和服務(wù)的共享。這些資源和服務(wù)包括但不限于,用于信息交換、緩存存儲(chǔ)和文件的磁盤存儲(chǔ)。分布式計(jì)算利用網(wǎng)絡(luò)連接,允許客戶機(jī)機(jī)利用他們的集體力量使整個(gè)企業(yè)受益。在這點(diǎn)上,多種設(shè)備可以具有包含和本發(fā)明的對(duì)象持久保存方法一起執(zhí)行的處理的應(yīng)用程序、對(duì)象或資源。圖16提供示例性網(wǎng)絡(luò)化或分布式計(jì)算環(huán)境的概圖。分布式計(jì)算環(huán)境包括計(jì)算對(duì)象10a、10b等和計(jì)算對(duì)象或設(shè)備110a、110b、110c等。這些對(duì)象可以包含程序、方法、數(shù)據(jù)存儲(chǔ)、可編程邏輯等等。(諸)對(duì)象可以包括部分相同或不同的設(shè)備,如個(gè)人數(shù)字助手(PDA)、電視、MP3播放器、個(gè)人計(jì)算機(jī)等等。每個(gè)對(duì)象都可以通過通信網(wǎng)絡(luò)14與另一個(gè)對(duì)象進(jìn)行通信。這一網(wǎng)絡(luò)本身可以包括其他計(jì)算對(duì)象和給圖16的系統(tǒng)提供服務(wù)的計(jì)算設(shè)備,而且自身可以代表多個(gè)相互連接的網(wǎng)絡(luò)。依照本發(fā)明的一個(gè)方面,每個(gè)對(duì)象10a、10b等或110a、110b、110c等,可以包含利用API或其他對(duì)象、軟件、固件和/或硬件以請(qǐng)求使用實(shí)施本發(fā)明的對(duì)象持久保存方法的進(jìn)程的應(yīng)用程序。也可以理解,對(duì)象如110c可以主宿在另外的計(jì)算設(shè)備10a、10b等或110a、110b等中。因此,盡管所描繪的物理環(huán)境可以將所連接的設(shè)備示出為計(jì)算機(jī),但這樣的例示只是示例性的,另外,物理環(huán)境也可以被描寫或描述為包括各種數(shù)字設(shè)備如個(gè)人數(shù)字助理(PDA)、電視、MP3播放器等以及軟件對(duì)象如接口、COM對(duì)象等。有多種支持分布式計(jì)算環(huán)境的系統(tǒng)、組件和網(wǎng)絡(luò)配置。例如,計(jì)算系統(tǒng)可以由有線或無線系統(tǒng)、由局域網(wǎng)絡(luò)或廣域分布式網(wǎng)絡(luò)連接在一起。現(xiàn)在,許多網(wǎng)絡(luò)被耦合到因特網(wǎng),因特網(wǎng)為廣域分布式計(jì)算提供基礎(chǔ)設(shè)施并包含許多不同的網(wǎng)絡(luò)。任何基礎(chǔ)設(shè)施都可以用于與本發(fā)明相關(guān)的示例性通信。因特網(wǎng)一般是指利用在計(jì)算機(jī)網(wǎng)絡(luò)領(lǐng)域中眾所周知的TCP/IP協(xié)議套件的網(wǎng)絡(luò)和網(wǎng)關(guān)的集合。TCP/IP是"TransmissionControlProtocol/InternetProtocol"的縮寫。因特網(wǎng)可以被描述為在地理上分布的遠(yuǎn)程計(jì)算機(jī)網(wǎng)絡(luò)的系統(tǒng),該遠(yuǎn)程計(jì)算機(jī)網(wǎng)絡(luò)由執(zhí)行網(wǎng)絡(luò)協(xié)議的計(jì)算機(jī)相互連接起來,而網(wǎng)絡(luò)協(xié)議允許諸用戶通過(諸)網(wǎng)絡(luò)相互作用和共享信息。由于這種廣泛傳播的信息共享,遠(yuǎn)程網(wǎng)絡(luò)如因特網(wǎng)通常進(jìn)一步發(fā)展成一個(gè)開放的系統(tǒng),開發(fā)者可以設(shè)計(jì)用于這一系統(tǒng)的、完成專門的操作或服務(wù)的軟件應(yīng)用程序,本質(zhì)上沒有限制。因此,網(wǎng)絡(luò)基礎(chǔ)設(shè)施可以實(shí)現(xiàn)許多網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),如客戶機(jī)/服務(wù)器,對(duì)等00或混合體系結(jié)構(gòu)。"客戶機(jī)"是一類或組的成員,該類或組使用與之無關(guān)的另一類或組的服務(wù)。因此,在計(jì)算中,客戶機(jī)是一個(gè)進(jìn)程,一般說來也就是一組請(qǐng)求由另一程序提供的服務(wù)的指令或任務(wù)??蛻魴C(jī)程序利用所請(qǐng)求的服務(wù),不必"知道"其他程序或服務(wù)本身的任何工作細(xì)節(jié)。在客戶機(jī)/服務(wù)器體系結(jié)構(gòu)中,尤其是在網(wǎng)絡(luò)化系統(tǒng)中,客戶機(jī)通常是一臺(tái)訪問由另一臺(tái)計(jì)算機(jī)(例如服務(wù)器)提供的共享網(wǎng)絡(luò)資源的計(jì)算機(jī)。在圖16的例子中,雖然計(jì)算機(jī)110a、110b等可以被看作客戶機(jī),計(jì)算機(jī)10a、10b等可以被看作服務(wù)器,但取決于環(huán)境,任何計(jì)算機(jī)都可以被看作客戶機(jī)、服務(wù)器或既是客戶機(jī)又是服務(wù)器。這些計(jì)算設(shè)備中的任何一個(gè)可以用包含本發(fā)明的對(duì)象持久保存技術(shù)的方式處理數(shù)據(jù)。服務(wù)器通常是可以通過遠(yuǎn)程網(wǎng)絡(luò)或是本地網(wǎng)絡(luò)如因特網(wǎng)訪問的遠(yuǎn)程計(jì)算機(jī)系統(tǒng)??蛻魴C(jī)進(jìn)程在第一計(jì)算機(jī)系統(tǒng)中可以是活動(dòng)的,服務(wù)器進(jìn)程在第二計(jì)算機(jī)系統(tǒng)中可以是活動(dòng)的,通過通信介質(zhì)相互通信,這樣就提供分布式功能性,允許多個(gè)客戶機(jī)利用服務(wù)器的數(shù)據(jù)收集能力。根據(jù)本發(fā)明的持久保存機(jī)制所利用的任何軟件對(duì)象可以分布在多個(gè)計(jì)算設(shè)備中。利用由協(xié)議層提供的功能,(諸)客戶機(jī)和(諸)服務(wù)器可以相互通信。例如,超文本傳輸協(xié)議(HyperTextTransferProtocol,HTTP)是用于萬維網(wǎng)(WorldWideWeb,WWW)或"Web"的公共協(xié)議。網(wǎng)絡(luò)地址可以被稱為URL地址。通信可以由任何可用通信介質(zhì)提供。因此,圖16例示具有通過網(wǎng)絡(luò)/總線與客戶機(jī)計(jì)算機(jī)通信的服務(wù)器的示范性的網(wǎng)絡(luò)化或分布式環(huán)境,本發(fā)明可以應(yīng)用于其中。網(wǎng)絡(luò)/總線14可以是局域網(wǎng)、廣域網(wǎng)、企業(yè)內(nèi)部互聯(lián)網(wǎng)、因特網(wǎng)或其他的網(wǎng)絡(luò)介質(zhì),具有若干客戶機(jī)或遠(yuǎn)程計(jì)算設(shè)備110a、110b、110c、110d、llOe等,如根據(jù)本發(fā)明的便攜式計(jì)算機(jī)、手持式計(jì)算機(jī)、痩客戶機(jī)、網(wǎng)絡(luò)化裝置,或其他設(shè)備如錄像機(jī)、電視、烤箱、燈具、加熱器等。因此,可以認(rèn)為本發(fā)明可以應(yīng)用于其中需要維護(hù)所持久保存的對(duì)象的任何計(jì)算設(shè)備。在通信網(wǎng)絡(luò)/總線14是因特網(wǎng)的網(wǎng)絡(luò)化環(huán)境中,例如,服務(wù)器10a、10b等可以是客戶機(jī)110a、110b、110c、110d、110e等通過一些已知協(xié)議(如HTTP)中的任何協(xié)議與之通信的服務(wù)器。服務(wù)器10a、10b等也可以充當(dāng)客戶機(jī)110a、110b、110c、110d、110e等,這是分布式計(jì)算環(huán)境的特征。如果和適,通信可以是有線的或無線的。客戶機(jī)設(shè)備110a、110b、110c、110d、110e等可以或可以不通過通信網(wǎng)絡(luò)/總線14通信,并且可以具有與其相關(guān)聯(lián)的獨(dú)立通信。例如,在電視或錄像機(jī)的情況下,可以有或沒有其控制的網(wǎng)絡(luò)化方面。每個(gè)客戶機(jī)計(jì)算機(jī)110a、110b、110c、110d、110e等和服務(wù)器計(jì)算機(jī)10a、10b等都可以配備各種應(yīng)用程序模塊或?qū)ο?35,并具有對(duì)各種類型的存儲(chǔ)元件或?qū)ο蟮倪B接或訪問,其中,文件或數(shù)據(jù)流可以被存儲(chǔ)到這些各種類型的存儲(chǔ)元件或?qū)ο?,或者,文件或?shù)據(jù)流的(諸)部分可以被下載、傳輸或轉(zhuǎn)移到這些各種類型的存儲(chǔ)元件或?qū)ο蟆H魏斡?jì)算機(jī)10a、10b、110a、110b等可以負(fù)責(zé)用于存儲(chǔ)根據(jù)本發(fā)明所處理數(shù)據(jù)的數(shù)據(jù)庫、存儲(chǔ)器或其他存儲(chǔ)元件20的維護(hù)和更新。因此,本發(fā)明可以用于計(jì)算機(jī)網(wǎng)絡(luò)環(huán)境中,該計(jì)算機(jī)網(wǎng)絡(luò)環(huán)境中具有可以訪問和與計(jì)算機(jī)網(wǎng)絡(luò)/總線14互動(dòng)的客戶機(jī)計(jì)算機(jī)110a、110b等,以及可以與客戶機(jī)計(jì)算機(jī)110a、110b等互動(dòng)的服務(wù)器計(jì)算機(jī)10a、llb等,以及其他類似設(shè)備和數(shù)據(jù)庫20。圖17和下列討論提供本發(fā)明可以與其一起實(shí)現(xiàn)的合適的計(jì)算設(shè)備的簡要的一般描述。例如,圖16中所例示的客戶機(jī)和服務(wù)器計(jì)算機(jī)或設(shè)備中的任何一個(gè)可以采用這種形式。但是應(yīng)該理解,在本發(fā)明中考慮使用所有種類的手持式、便攜式和其他計(jì)算設(shè)備以及計(jì)算對(duì)象,即是說,計(jì)算環(huán)境中數(shù)據(jù)可以從中被產(chǎn)生、處理、接收和/或傳輸?shù)娜魏挝恢?。盡管下面描述的是通用計(jì)算機(jī),但這不過只是一個(gè)例子,可以使用具有網(wǎng)絡(luò)/總線互操作性和交互動(dòng)作的痩客戶機(jī)實(shí)現(xiàn)本發(fā)明。因此,本發(fā)明可以在包含很少或最少客戶機(jī)資源的網(wǎng)絡(luò)化主宿服務(wù)的環(huán)境如網(wǎng)絡(luò)化環(huán)境中實(shí)現(xiàn),例如,網(wǎng)絡(luò)化環(huán)境,其中客戶機(jī)設(shè)備諸如放置在設(shè)備中的對(duì)象僅僅作為網(wǎng)絡(luò)/總線的接口。本質(zhì)上,數(shù)據(jù)可以被存儲(chǔ)在任何位置,或數(shù)據(jù)可以從中被檢索或從中被傳輸?shù)搅硪慌_(tái)計(jì)算機(jī)的任何位置,都是用于操作本發(fā)明的對(duì)象持久保存方法的所需的或適當(dāng)?shù)沫h(huán)境。盡管不是必需,但也可以通過操作系統(tǒng)來實(shí)現(xiàn)本發(fā)明,其中,操作系統(tǒng)供設(shè)備或?qū)ο蟮姆?wù)的開發(fā)者使用,并且/或者被包括在根據(jù)本發(fā)明工作的應(yīng)用程序或服務(wù)器軟件中。軟件可以在像程序模塊那樣的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,由一臺(tái)或多計(jì)算機(jī)如客戶機(jī)工作站、服務(wù)器或其他設(shè)備執(zhí)行。一般地,程序模塊包括完成特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。通常,程序模塊的功能性可以根據(jù)各種實(shí)施例的需要進(jìn)行組合或分配。而且,本發(fā)明可以用其他的計(jì)算機(jī)系統(tǒng)配置和協(xié)議實(shí)現(xiàn)。適用于本發(fā)明的其他眾所周知的計(jì)算系統(tǒng)、環(huán)境、和/或配置包括但不限于個(gè)人計(jì)算機(jī)(PC)、自動(dòng)取款機(jī)、服務(wù)器計(jì)算機(jī)、手持式或膝上型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、可編程消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC、設(shè)備、燈具、環(huán)境控制元件、微型計(jì)算機(jī)、大型計(jì)算機(jī)等等。因此,圖17例示本發(fā)明可以在其中實(shí)現(xiàn)的適當(dāng)?shù)挠?jì)算系統(tǒng)環(huán)境100的例子,盡管上面已經(jīng)說明,計(jì)算機(jī)系統(tǒng)環(huán)境ioo只是適當(dāng)?shù)挠?jì)算機(jī)環(huán)境的一個(gè)例子,并不暗示對(duì)本發(fā)明的使用范圍或功能性作任何限制。計(jì)算機(jī)環(huán)境100也不應(yīng)該被解釋為具有與在示例性操作環(huán)境ioo中所例示的任何組件或它們的組合有關(guān)的任何依賴或要求。參見圖17,用于實(shí)現(xiàn)本發(fā)明的示例性系統(tǒng)包括一個(gè)以計(jì)算機(jī)110形式的通用計(jì)算設(shè)備。計(jì)算機(jī)110的組件包括但不限于處理單元120、系統(tǒng)存儲(chǔ)器130、將包括系統(tǒng)存儲(chǔ)器在內(nèi)的各個(gè)系統(tǒng)組件耦合到處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可以是包括使用多種總線體系結(jié)構(gòu)的存儲(chǔ)器總線或存儲(chǔ)器控制器、外圍總線以及本地總線在內(nèi)的若干總線結(jié)構(gòu)類型中的任一種。作為例子,而非限制,此類體系結(jié)構(gòu)包括工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(ISA)總線、微通道體系結(jié)構(gòu)(MCA)總線、增強(qiáng)型ISA(EISA)總線、視頻電子標(biāo)準(zhǔn)協(xié)會(huì)(VESA)局部總線以及外圍組件互連(PCI)總線(也稱為Mezzanine總線)。計(jì)算機(jī)110通常包括各種計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是能由計(jì)算機(jī)110訪問的任何可用介質(zhì),而且包含易失性/非易失性介質(zhì)以及可移動(dòng)/不可移動(dòng)介質(zhì)。作為例子,而非限制,計(jì)算機(jī)可讀介質(zhì)可以包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括用存儲(chǔ)信息如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)的任何方法和技術(shù)實(shí)現(xiàn)的易失性和非易失性的、可移動(dòng)的和不可移動(dòng)的介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于RAM、R0M、EEPR0M、閃速存儲(chǔ)器或其他存儲(chǔ)器技術(shù)、CD—R0M、數(shù)字通用盤(DVD)或其他光學(xué)存儲(chǔ)器、磁帶盒、磁帶、磁盤存儲(chǔ)器或其他磁存儲(chǔ)設(shè)備或可以用于存儲(chǔ)所需信息并可以被計(jì)算機(jī)110訪問的任何其他介質(zhì)。通信介質(zhì)通常以已調(diào)制的數(shù)據(jù)信號(hào)如載波或其他傳輸機(jī)制的形式包含計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù),并包括任意信息傳遞介質(zhì)。術(shù)語"已調(diào)制的數(shù)據(jù)信號(hào)"是指以在該信號(hào)中編碼信息的方式來設(shè)置或改變其一個(gè)或多個(gè)特性的信號(hào)。作為例子而非限制,通信介質(zhì)包括有線介質(zhì)如有線網(wǎng)絡(luò)或有線直接連接,以及無線介質(zhì)如聲音、射頻、紅外和其他無線介質(zhì)。以上任何介質(zhì)的組合也應(yīng)當(dāng)被包括在計(jì)算機(jī)可讀介質(zhì)的范圍之內(nèi)。系統(tǒng)存儲(chǔ)器130包括易失性和/或非易失性存儲(chǔ)器如只讀存儲(chǔ)器(R0M)131以及隨機(jī)存取存儲(chǔ)器(RAM)132形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)?;据斎?輸出系統(tǒng)133(BIOS)通常存儲(chǔ)在ROM131中,它包括幫助在計(jì)算機(jī)110內(nèi)的元件間傳輸信息的基本例程,比如在啟動(dòng)過程中。RAM132通常包含可以由處理單元120即時(shí)存取的和/或目前在操作的數(shù)據(jù)和/或程序模塊。作為例子,而非限制,圖17例示了操作系統(tǒng)134、應(yīng)用程序135、其他程序模塊136以及程序數(shù)據(jù)137。計(jì)算機(jī)110還包括其他可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。僅僅作為例子,圖8例示從不可移動(dòng)的非易失性磁性介質(zhì)讀取或向其中寫入的硬盤驅(qū)動(dòng)器141、從可移動(dòng)的非易失性磁盤152讀取或向其中寫入的磁盤驅(qū)動(dòng)器151以及從可移動(dòng)非易失性光介質(zhì)156如CD-ROM或其他光學(xué)介質(zhì)讀取或向其中寫入的光盤驅(qū)動(dòng)器155。其他可以用于示例性操作環(huán)境的可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于盒式磁帶、閃存卡、數(shù)字多用途盤、數(shù)字視頻磁帶、固態(tài)RAM、固態(tài)R0M等等。硬盤驅(qū)動(dòng)器141通常通過不可移動(dòng)存儲(chǔ)器接口如接口140連接到系統(tǒng)總線121,而磁盤驅(qū)動(dòng)器151和光盤驅(qū)動(dòng)器155通常通過可移動(dòng)存儲(chǔ)器接口如接口150連接到系統(tǒng)總線121。以上在圖17中討論且例示的驅(qū)動(dòng)器及其相關(guān)計(jì)算機(jī)存儲(chǔ)介質(zhì)為計(jì)算機(jī)110提供計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊及其他數(shù)據(jù)的存儲(chǔ)。例如,在圖17中,硬盤驅(qū)動(dòng)器141被例示為存儲(chǔ)操作系統(tǒng)144、應(yīng)用程序145、其他程序模塊146和程序數(shù)據(jù)147。注意,這些組件可以與操作系統(tǒng)134、應(yīng)用程序135、其他程序模塊136和程序數(shù)據(jù)137相同,也可以與它們不同。這里對(duì)操作系統(tǒng)144、應(yīng)用程序145、其他程序模塊146和程序數(shù)據(jù)147給予不同的標(biāo)號(hào)來說明至少它們是不同的副本。用戶可以通過輸入設(shè)備如鍵盤162和定位設(shè)備161(例如鼠標(biāo)、跟蹤球或觸摸板)向計(jì)算機(jī)110輸入命令和信息。其他輸入設(shè)備(未示出)可以包括麥克風(fēng)、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些和其他輸入設(shè)備通常通過耦合至系統(tǒng)總線的用戶輸入接口160連接至處理單元120,但是也可以通過其他接口和總線結(jié)構(gòu)連接,如并行端口、游戲端口或通用串行總線(USB)。圖形接口182也可以被連接到系統(tǒng)總線121。一個(gè)或多個(gè)圖形處理單元(GPU)184可以與圖形接口182通信。監(jiān)視器191或其他類型的顯示設(shè)備也通過接口如進(jìn)而與視頻存儲(chǔ)器186通信的視頻接口190連接至系統(tǒng)總線121。除監(jiān)視器191之外,計(jì)算機(jī)也可以包括其他外圍輸出設(shè)備,如揚(yáng)聲器197和打印機(jī)196,它們可通過輸出外圍接口195連接。計(jì)算機(jī)110可以工作在使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)如遠(yuǎn)程計(jì)算機(jī)180的邏輯連接的網(wǎng)絡(luò)化或分布式環(huán)境中。遠(yuǎn)程計(jì)算機(jī)180可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其他公共網(wǎng)絡(luò)節(jié)點(diǎn),并且一般包括與計(jì)算機(jī)110相關(guān)的許多或所有上述元件,盡管圖17中僅例示了存儲(chǔ)設(shè)備181。圖17中所描述的邏輯連接包括局域網(wǎng)(LAN)171以及廣域網(wǎng)(WAN)173,但是也可以包括其他網(wǎng)絡(luò)/總線。這類網(wǎng)絡(luò)環(huán)境常見于家庭、辦公室、企業(yè)范圍內(nèi)的計(jì)算機(jī)網(wǎng)絡(luò)、企業(yè)內(nèi)部互聯(lián)網(wǎng)和因特網(wǎng)。當(dāng)用于LAN網(wǎng)絡(luò)環(huán)境時(shí),計(jì)算機(jī)110通過網(wǎng)絡(luò)接口或適配器170連接到LAN171。當(dāng)用于WAN網(wǎng)絡(luò)環(huán)境時(shí),計(jì)算機(jī)110通常包括調(diào)制解調(diào)器172或其他用于在WAN173(如因特網(wǎng))上建立通信的裝置??梢詢?nèi)置或者外置的調(diào)制解調(diào)器172可以通過用戶輸入接口160或其他適當(dāng)?shù)难b置連接到系統(tǒng)總線121。在網(wǎng)絡(luò)化環(huán)境中,所描述的與個(gè)人計(jì)算機(jī)iio相關(guān)的程序模塊或其中的一部分可以存儲(chǔ)在遠(yuǎn)程存儲(chǔ)設(shè)備中。作為例子而非限制,圖17例示遠(yuǎn)程應(yīng)用程序185駐留在存儲(chǔ)器設(shè)備181上。應(yīng)該明白,所示網(wǎng)絡(luò)連接是示例性,并且可以使用在計(jì)算機(jī)之間建立通信鏈路的其他方式。如前所述,本發(fā)明涉及在數(shù)據(jù)庫存儲(chǔ)中存儲(chǔ)和檢索用戶定義類型的實(shí)例的字段的XML數(shù)據(jù)的系統(tǒng)和方法。應(yīng)該理解,可以改變上述的實(shí)施例而沒有偏離其主要發(fā)明概念。例如,盡管上面已經(jīng)描述本發(fā)明的一個(gè)實(shí)施例可以在微軟的SQLSERVER數(shù)據(jù)庫管理系統(tǒng)中實(shí)現(xiàn),但應(yīng)該理解,本發(fā)明可以在支持創(chuàng)建用戶定義類型的任何數(shù)據(jù)庫管理系統(tǒng)中實(shí)現(xiàn)。因此,應(yīng)該理解,本發(fā)明不局限于所公開的特定實(shí)施例,而是包括在所附權(quán)利要求書中所定義的本發(fā)明的精神和范圍之內(nèi)的所有修改。權(quán)利要求1.在一系統(tǒng)中的一種方法,所述系統(tǒng)中,一對(duì)象可以被持久保存在數(shù)據(jù)庫存儲(chǔ)中,該對(duì)象是用戶定義類型的實(shí)例,其中用戶定義類型的定義在受管代碼中被提供為一個(gè)類,并包括一個(gè)或多個(gè)字段和行為,每一字段具有各自的數(shù)據(jù)類型,所述方法包括在受管代碼中定義一個(gè)類,所述類表示用于用戶定義類型的字段的XML數(shù)據(jù)類型;將用戶定義類型的受管代碼類定義中的一個(gè)字段定義為表示所述XML數(shù)據(jù)類型的受管代碼類的一個(gè)實(shí)例;以及在所述數(shù)據(jù)庫存儲(chǔ)中持久保存所述用戶定義類型的一個(gè)實(shí)例,由此所持久保存的實(shí)例的字段可以包含XML數(shù)據(jù)。2.如權(quán)利要求l所述的方法,其特征在于,表示XML數(shù)據(jù)類型的所述受管代碼類包括至少一個(gè)構(gòu)造函數(shù)和至少一個(gè)返回對(duì)象的方法,通過這個(gè)方法,可以檢索用戶定義類型的所持久保存的實(shí)例的字段中的XML數(shù)據(jù)。3.如權(quán)利要求l所述的方法,其特征在于,還包括將一個(gè)方法添加到用戶定義類型的受管代碼類定義中,以實(shí)現(xiàn)用戶定義類型的、被定義為表示XML數(shù)據(jù)類型的受管代碼類的一個(gè)實(shí)例的字段上的行為。4.如權(quán)利要求l所述的方法,其特征在于,還包括將包含XML數(shù)據(jù)的用戶定義類型的實(shí)例的字段與定義所述字段中XML數(shù)據(jù)的內(nèi)容模型的XML模式相關(guān)聯(lián)的步驟。5.如權(quán)利要求4所述的方法,其特征在于,所述關(guān)聯(lián)步驟包括用標(biāo)識(shí)主宿數(shù)據(jù)庫存儲(chǔ)的服務(wù)器上的XML模式的屬性來注釋用戶定義類型的受管代碼類定義。6.如權(quán)利要求1所述的方法,其特征在于,還包括以下步驟中的至少一個(gè)查詢持久保存在數(shù)據(jù)庫存儲(chǔ)中的用戶定義類型的一個(gè)實(shí)例;以及修改持久保存在數(shù)據(jù)庫存儲(chǔ)中的用戶定義類型的一個(gè)實(shí)例。7.—種系統(tǒng),包括一提供受管代碼執(zhí)行的運(yùn)行庫,所述運(yùn)行庫包括受管代碼中表示XML數(shù)據(jù)類型的一個(gè)類;以及受管代碼中定義用于將用戶定義類型的對(duì)象存儲(chǔ)在數(shù)據(jù)庫存儲(chǔ)中的用戶定義類型的一個(gè)類,所述用戶定義類型的類定義包括一個(gè)或多個(gè)字段,每個(gè)字段有各自的數(shù)據(jù)類型,且至少一個(gè)所述字段被定義為表示XML數(shù)據(jù)類型的受管代碼類的一個(gè)實(shí)例;以及用于存儲(chǔ)用戶定義類型的實(shí)例的數(shù)據(jù)庫存儲(chǔ),所持久保存的實(shí)例的字段可以包括XML數(shù)據(jù)。8.如權(quán)利要求7所述的系統(tǒng),其特征在于,表示XML數(shù)據(jù)類型的受管代碼類包括至少一個(gè)構(gòu)造函數(shù)和至少一個(gè)返回對(duì)象的方法,通過該方法,可檢索用戶定義類型的持久保存的示例的字段中的XML數(shù)據(jù)。9.如權(quán)利要求7所述的系統(tǒng),其特征在于,定義用戶定義類型的受管代碼類還包括實(shí)現(xiàn)包含XML數(shù)據(jù)的用戶定義類型的實(shí)例的字段中的行為的方法。10.如權(quán)利要求7所述的系統(tǒng),其特征在于,定義用戶定義類型的受管代碼類還包括包含XML數(shù)據(jù)的用戶定義類型的實(shí)例字段與定義所述字段中XML數(shù)據(jù)的內(nèi)容模型的XML模式之間的關(guān)聯(lián)。11.如權(quán)利要求IO所述的系統(tǒng),其特征在于,所述關(guān)聯(lián)包括被應(yīng)用于定義用戶定義類型的受管代碼類的字段的屬性,所述屬性標(biāo)識(shí)主宿數(shù)據(jù)庫存儲(chǔ)的服務(wù)器上的XML模式。12.—種其上儲(chǔ)存程序代碼的計(jì)算機(jī)可讀介質(zhì),用于一系統(tǒng)中,所述系統(tǒng)中一對(duì)象可以被持久保存在數(shù)據(jù)庫存儲(chǔ)中,所述對(duì)象是用戶定義類型的實(shí)例,所述程序代碼包括受管代碼中表示用于用戶定義類型的字段的XML數(shù)據(jù)類型的第一類;受管代碼中定義用戶定義類型的第二類,所述第二類包括一個(gè)或多個(gè)字段和行為,每個(gè)字段具有各自的數(shù)據(jù)類型,所述第二類中的所述字段的至少一個(gè)被定義為所述第一類的一個(gè)實(shí)例;以及所述程序代碼,當(dāng)在一臺(tái)計(jì)算機(jī)上執(zhí)行時(shí),使得計(jì)算機(jī)可以在數(shù)據(jù)庫存儲(chǔ)中持久保存用戶定義類型的實(shí)例,其中所述所持久保存的實(shí)例的至少一個(gè)字段包含XML數(shù)據(jù)。13.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述第一類包括至少一個(gè)構(gòu)造函數(shù)和至少一個(gè)返回對(duì)象的方法,通過這個(gè)方法,可以檢索用戶定義類型的所持久保存的實(shí)例的字段中的XML數(shù)據(jù)。14.如權(quán)利要求12所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述第二類還包括一個(gè)方法,所述方法實(shí)現(xiàn)被定義為所述第一類的實(shí)例的用戶定義類型的所述的至少一個(gè)字段的行為。15.如權(quán)利要求12所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,包含XML數(shù)據(jù)的用戶定義類型的實(shí)例的所述至少一個(gè)字段與定義所述字段中的XML數(shù)據(jù)的內(nèi)容模型的XML模式相關(guān)聯(lián)。16.如權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,通過對(duì)標(biāo)識(shí)主宿數(shù)據(jù)庫存儲(chǔ)的服務(wù)器上的XML模式的屬性的所述第二類中的所述至少一個(gè)字段的定義進(jìn)行注釋,所述至少一個(gè)字段與所述XML模式相關(guān)聯(lián)。17.如權(quán)利要求12所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述程序代碼還使計(jì)算機(jī)能夠査詢持久保存在數(shù)據(jù)庫存儲(chǔ)中的用戶定義類型的一個(gè)實(shí)例;以及修改持久保存在數(shù)據(jù)庫存儲(chǔ)中的用戶定義類型的一個(gè)實(shí)例。全文摘要提供一種系統(tǒng)和方法,用于建模在數(shù)據(jù)庫存儲(chǔ)中的用戶定義類型(UDT)的單個(gè)實(shí)例里的所有結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)。尤其,XML數(shù)據(jù)模型被擴(kuò)展到用戶定義類型(UDT)的字段。結(jié)果,XML數(shù)據(jù)模型的特性——如文件次序和文件結(jié)構(gòu)——可以被保留在UDT的實(shí)例中。而且,表示對(duì)象行為(即,可以在受管代碼中的對(duì)象上被調(diào)用的方法)的代碼可以被添加到UDT,以便于對(duì)UDT的XML字段和非XML字段進(jìn)行操作。這框架能將業(yè)務(wù)邏輯添加到XML數(shù)據(jù)。使用與UDT的XML字段相關(guān)聯(lián)的XML模式,XML數(shù)據(jù)的內(nèi)容模型可以任選地被描述。文檔編號(hào)G06F7/00GK101410830SQ200480001709公開日2009年4月15日申請(qǐng)日期2004年7月29日優(yōu)先權(quán)日2003年10月24日發(fā)明者A·阿齊森,C·-H·陳,D·Y·阿爾圖多夫,I·切爾日,J·A·布萊克雷,R·凡卡特施,S·帕爾申請(qǐng)人:微軟公司