Share via


處理 xml 資料類型及 CLR 使用者自訂類型

在 SQL Server 2005 的「原生 XML Web Service」中,傳遞 xml 資料類型或 Common Language Runtime (CLR) 使用者自訂類型之類的新類型時,需要一些額外的開發工作。本主題說明您必須執行的工作,以便啟用 XML Web 服務架構的應用程式來處理 Web 方法及參數化查詢中的 xml 及 CLR 使用者自訂類型。

ms175119.note(zh-tw,SQL.90).gif附註:
這裡假設您具有在 SQL Server 2005 中部署「原生 XML Web Service」的基本知識,包括熟悉下列工作:建立端點、以程式設計方式將 SQL 公開為 Web 方法,以及為使用其他內建 SQL 類型的 SQL Server 撰寫基本 Web 用戶端應用程式。若要檢閱此資訊,請參閱<在 SQL Server 2005 使用原生 XML Web Service>、<部署原生 XML Web Service>及<使用原生 XML Web Service 的最佳作法>。

在 Web 用戶端應用程式中處理 xml 資料類型

若要讓 Web 用戶端應用程式能夠正確處理 xml 資料類型,需視適用的情況是下列哪一種,並據以調整某些細節:

  • 您使用在結束點上被公開為 Web 方法的預存程序。
  • 您使用結束點的 SQL 批次 (sqlbatch) 功能來執行參數化查詢。

上述這兩種情況都需要使用並填入 myEndpoint**::xml** 結構,來處理 xml 資料類型的參數化執行個體。在此結構中,myEndpoint 代表當 xml 資料類型的執行個體透過用戶端程式碼傳遞時,所使用的結束點實際名稱。此結構是在結束點 Web Proxy 類別中宣告。

若結束點在 Visual Studio 專案中公開 Web 方法,則當您加入或更新對該結束點的 Web 參考時,就會建立 myEndpoint**::xml** 結構。不過,根據您在用戶端應用程式碼中使用的是具類型的 XML 或不具類型的 XML,您必須視情況在自訂的 Web Proxy 類別中,填入最初產生的 myEndpoint**::xml** 結構。

若是 Web 方法中不具類型的 xml 資料類型參數執行個體,myEndpoint**::xml** 結構會在 Proxy 類別中將其公開成 System.Xml.XmlNode 類型的陣列。因此,若要傳入 xml 資料類型參數執行個體,您就要手動建構並填入一個 XML 節點陣列,或最好是使用 System.Xml.XmlDocumentFragment 來執行此作業。如需詳細資訊,請參閱<在 Visual Studio 用戶端應用程式中使用 xml 資料類型>。

若是 Web 方法中具類型的 xml,則會在 Web Proxy 類別中產生自訂類型,並依照下列格式來命名:方法名稱連著 Type 這個字,後面再接參數的名稱。例如,若 Web 方法是使用 GetXmlInfo 這個名稱來公開的,並採用名為 Txml 資料類型參數,將具類型的 XML 當成輸入值來傳遞,則 Web Proxy 類別中的公開自訂類型名稱就是 GetXmlInfoTypeT。此自訂類型繼承自 myEndpoint**::xml** 結構,因此同樣地,它會將具類型的 XML 公開成 System.Xml.XmlNode 陣列。

在參數化查詢中處理 xml 資料類型的方式,與在 Web 方法中使用 xml 資料類型類似,但有一點例外:必須使用不具類型之 XML 所用的相同類型 (myEndpoint**::xml**),從用戶端傳遞具類型的 XML。

準備好 myEndpoint**::xml** 結構之後,就可以在所定義的結構中,將 xml 資料類型執行個體公開成 System.Xml.XmlNode 陣列,接著此項目會內含在 SqlParameter.Value 物件中。

參數化查詢需要 SQL 批次功能,其中會牽涉到下列額外的準備工作:

  • 結束點上必須啟用 SQL。這表示在建立或修改結束點時,會用到 BATCHES=ENABLED。
  • 在 Web Proxy 類別中,針對已啟用批次功能的結束點來加入或更新 Web 參考時,將會併入 sqlbatch() 方法。

若是具類型的 XML 參數,則會更新 Web Proxy 類別中的 sqlbatch() 方法,以併入任何其他屬性 (XmlSchemaCollectionDatabaseXmlSchemaCollectionNameXmlSchemaCollectionOwningSchema) 的設定,這些屬性是為 System.Data.SqlClient.SqlParameter 物件註冊 XML 結構描述集合時的相關屬性。

ms175119.note(zh-tw,SQL.90).gif附註:
對於公開 xml 資料類型的 Web 方法及參數化查詢,若會在輸出中傳回 System.Data.DataSet (屬於物件陣列的一部份),且其內容會放在 DataGrid 中以便在用戶端應用程式中將結果視覺化,則 DataSet 不會使用 Web Proxy 類型 (myEndpoint::xml),而是改用 CLR System.Data.SqlTypes.SqlXml 類型。

以 Web 用戶端應用程式來處理 CLR 使用者自訂類型

若要在 Web 用戶端應用程式中處理 CLR 使用者自訂類型,您必須完成下列步驟:

  1. 撰寫 CLR 使用者自訂類型,並編譯成 DLL,例如 MyType.dll。
    在 Visual Studio 2005 中,撰寫 CLR 使用者自訂類型 (類別或結構),並編譯成組件。類型組件必須符合實作使用者自訂類型的 SQL Server 2005 需求。這樣可將組件安裝並註冊在 SQL Server 2005 執行個體上。如需詳細資訊,請參閱<CLR User-Defined Types>中的<實作 UDT 的需求>。

  2. 為了產生「XML 序列化程式」隨附 DLL,如果您尚未實作 IXMLSerializable,請在類型組件 DLL 上執行 Sgen.exe。其名稱可能會類似於:MyType.XmlSerializers.dll。
    除需符合 CLR 使用者自訂類型的基本需求以使用 SQL Server 2005 之外,CLR 使用者自訂類型也必須可序列化成 XML,才能在 SQL Server 2005 中使用「原生 XML Web Service」。如需詳細資訊,請參閱<CLR User-Defined Types>中的<XML 序列化>。

  3. 使用 CREATE ASSEMBLY,在 SQL Server 2005 的執行個體上安裝類型組件 DLL。
    如果您尚未實作 IXMLSerializable 也沒有完成步驟 2,則您還必須使用 CREATE ASSEMBLY,在 SQL Server 2005 執行個體上安裝「XML 序列化程式」隨附 DLL。

  4. 以類似上一節所描述的內容,將 CLR 使用者自訂類型序列化成 XML,並將其併入 myEndpoint**::xml** 結構。
    將 CLR 使用者自訂類型安裝在伺服器之後,若要將該 CLR 使用者自訂類型的執行個體從「原生 XML Web Service」用戶端應用程式傳遞至 SQL Server 2005 中,您必須先將 CLR 使用者自訂類型序列化成 XML 格式,並將其併入 XML**結構。
    下列程式碼顯示如何將 CLR 使用者自訂類型序列化成 XML 格式,並將其放在 XML 元素 (System.Xml.XmlElement) 中。

    // Create the user-defined type class on the client.
    SqlString s = new SqlString("0:0");
    UdtClientApp.Point pnt = Point.Parse(s);
    // Invoke the method and pass in a user-defined type.You will need
    // to convert this to XmlElement before you can pass it to SQL Server.
    System.IO.MemoryStream writer = new System.IO.MemoryStream();
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(UdtClientApp.Point));
    serializer.Serialize(writer, pnt);
    writer.Seek(0, System.IO.SeekOrigin.Begin);
    System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
    xmlDoc.Load(writer);
    System.Xml.XmlElement udtXml = xmlDoc.DocumentElement;
    
  5. 根據用戶端上是否具有 CLR 使用者自訂類型,您可能還需將輸出參數從其 CLR 使用者自訂類型 XML 格式還原序列化,回復成其使用者自訂類型格式。
    下列程式碼顯示如何將使用者自訂類型 XML 還原序列化,回復成用戶端程式碼中的 CLR 使用者自訂類型。在此範例中,CLR 使用者自訂類型為 Point

    Object[] results = proxy.GetPointUdt(Convert.ToInt16(textBox1.Text), ref udtXml);
    //Deserialze the XML into user-defined type.
    TextReader reader = new StringReader(udtXml.OuterXml);
    // pnt was already defined as UdtClientApp.Point pnt = Point.Parse(s);
    pnt = (UdtClientApp.Point) serializer.Deserialize(reader);
    

    請注意,若您在用戶端上使用的 CLR 使用者自訂類型是不具類型的 XML,就不需要執行這個還原序列化程序。

您也可以利用 xml 資料類型一節所說明的方法,將 CLR 使用者自訂類型當成參數傳遞至參數化查詢。您必須使用 myEndpoint**::xml** 類型,從用戶端來傳遞 XML 序列化格式的 CLR 使用者自訂類型。

至於牽涉到 CLR 使用者自訂類型的參數化查詢,System.Data.SqlClient.SqlParameter 結構上需設定不同的值。例如,請將下列屬性設定用於 CLR 使用者自訂類型:

  • SqlDbType 屬性必須設為 Udt 的值。
  • ClrTypeName 屬性必須設成所安裝之使用者自訂類型的 SQL Server 三部份完整名稱 (MyDatabase**.MySchema.**MyUdtType),與其在 SQL Server 2005 執行個體上註冊的一樣。

請參閱

概念

使用原生 XML Web Service 的最佳作法
部署原生 XML Web Service

其他資源

在 SQL Server 2005 使用原生 XML Web Service
CLR User-Defined Types

說明及資訊

取得 SQL Server 2005 協助