Share via


xml 데이터 형식 및 CLR 사용자 정의 유형 처리

Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.

SQL Server 2005부터 네이티브 XML 웹 서비스에서 xml 데이터 형식이나 CLR(공용 언어 런타임) 사용자 정의 형식과 같은 유형을 전달하려면 일부 추가 개발 태스크가 필요합니다. 이 항목에서는 웹 메서드 및 매개 변수가 있는 쿼리에서 xml 및 CLR 사용자 정의 형식을 사용하도록 XML 웹 서비스 기반 응용 프로그램을 설정하기 위해 수행해야 하는 태스크에 대해 설명합니다.

[!참고]

여기에서는 SQL Server의 네이티브 XML 웹 서비스 배포에 대한 기본 사항을 알고 있다고 가정합니다. 이를 위해서는 끝점 만들기, SQL 프로그래밍 기능을 웹 메서드로 제공 및 다른 기본 제공 SQL 유형을 사용하는 SQL Server용 기본 웹 클라이언트 응용 프로그램 작성 등의 태스크에 익숙해야 합니다. 이러한 정보를 확인하려면 네이티브 XML 웹 서비스 개념, 네이티브 XML 웹 서비스 배포네이티브 XML 웹 서비스 사용을 위한 최선의 구현 방법을 참조하십시오.

웹 클라이언트 응용 프로그램에서 xml 데이터 형식 처리

웹 클라이언트 응용 프로그램에서 xml 데이터 형식을 올바르게 처리하기 위한 일부 세부 항목은 다음 중 어떤 시나리오를 적용하는지에 따라 달라집니다.

  • 끝점에서 웹 메서드로 제공되는 저장 프로시저를 사용합니다.

  • 끝점의 SQL 일괄 처리(sqlbatch) 기능을 사용하여 매개 변수가 있는 쿼리를 실행합니다.

이러한 시나리오 모두 myEndpoint**::xml** 구조를 사용하고 채움으로써 xml 데이터 형식의 매개 변수가 있는 인스턴스를 처리해야 합니다. 이 구조에서 myEndpoint는 xml 데이터 형식의 인스턴스가 클라이언트측 코드를 통과할 때 사용되는 끝점의 실제 이름을 나타냅니다. 이 구조는 끝점 웹 프록시 클래스에서 선언됩니다.

myEndpoint**::xml** 구조는 Visual Studio 프로젝트에 웹 메서드를 제공하는 끝점에 대한 웹 참조를 추가하거나 업데이트할 때 생성됩니다. 하지만 클라이언트측 응용 프로그램 코드에서 형식화된 XML 또는 형식화되지 않은 XML을 사용하는지 여부에 따라 사용자 지정 웹 프록시 클래스에 처음 생성된 myEndpoint**::xml** 구조를 알맞게 채워야 합니다.

웹 메서드에 있는 형식화되지 않은 xml 데이터 형식 매개 변수 인스턴스의 경우 myEndpoint**::xml** 구조는 프록시 클래스에 있는 System.Xml.XmlNode 유형의 배열로 인스턴스를 제공합니다. 따라서 xml 데이터 형식 매개 변수 인스턴스를 전달하려면 XML 노드 배열을 수동으로 구성하고 채우거나 이를 위해 System.Xml.XmlDocumentFragment를 사용합니다. 자세한 내용은 Visual Studio 클라이언트 응용 프로그램의 xml 데이터 형식 작업을 참조하십시오.

웹 메서드에 있는 형식화된 xml의 경우 사용자 지정 형식은 웹 프록시 클래스에서 생성되며 다음 형식에 따라 명명됩니다. 메서드 이름에 Type 단어가 연결된 다음 매개 변수 이름이 표시됩니다. 예를 들어 GetXmlInfo 이름을 사용하여 웹 메서드를 제공하고 웹 메서드에서 입력으로 형식화된 XML을 전달하여 xml 데이터 형식 매개 변수 이름으로 T를 사용하는 경우 웹 프록시 클래스에 제공된 사용자 지정 유형의 이름은 GetXmlInfoTypeT가 됩니다. 이 사용자 지정 형식은 myEndpoint**::xml** 구조로부터 상속되므로 이와 비슷하게, 형식화된 XML을 System.Xml.XmlNode의 배열로 제공합니다.

매개 변수가 있는 쿼리에서 xml 데이터 형식을 취급하는 방법은 웹 메서드에서 xml 데이터 형식을 사용하는 방법과 비슷하지만 형식화되지 않은 XML에서 사용되는 것과 동일한 유형(myEndpoint**::xml**)을 사용하여 클라이언트에서 형식화된 XML을 전달해야 한다는 점만 다릅니다.

myEndpoint**::xml** 구조가 준비된 다음에는 xml 데이터 형식 인스턴스를 정의된 구조 내에 있는 System.Xml.XmlNode의 배열로 제공할 수 있으며, 이 배열은 다시 SqlParameter.Value 개체에 포함됩니다.

매개 변수가 있는 쿼리에는 SQL 일괄 처리 기능이 필요합니다. 이를 위해서는 다음과 같은 추가 준비가 포함될 수 있습니다.

  • 끝점에 SQL이 설정되어야 합니다. 즉, 끝점을 만들거나 수정할 때 BATCHES=ENABLED가 사용되어야 합니다.

  • 웹 프록시 클래스에서 일괄 처리가 설정된 끝점에 대해 웹 참조가 추가 또는 업데이트될 때 sqlbatch() 메서드가 포함됩니다.

형식화된 XML 매개 변수의 경우 웹 프록시 클래스에 있는 sqlbatch() 메서드가 업데이트되어 System.Data.SqlClient.SqlParameter 개체에 대한 XML 스키마 컬렉션의 등록과 관련된 추가 속성(XmlSchemaCollectionDatabase, XmlSchemaCollectionName, XmlSchemaCollectionOwningSchema) 설정이 포함됩니다.

[!참고]

System.Data.DataSet가 객체의 배열에 대한 일부로 출력에 반환되고 해당 내용이 DataGrid에 표시되어 클라이언트 응용 프로그램에서 결과를 시각화하는 웹 메서드와 xml 데이터 형식을 제공하는 매개 변수가 있는 쿼리의 경우 DataSet은 웹 프록시 유형(myEndpoint::xml)을 사용하지 않으며 그 대신 CLR System.Data.SqlTypes.SqlXml 유형을 사용합니다.

웹 클라이언트 응용 프로그램에서 CLR 사용자 정의 형식 처리

웹 클라이언트 응용 프로그램에서 CLR 사용자 정의 형식을 처리하려면 다음 단계를 완료해야 합니다.

  1. CLR 사용자 정의 형식을 작성하고 MyType.dll과 같은 DLL로 컴파일합니다.

    Visual Studio 2005에서 CLR 사용자 정의 형식(클래스 또는 구조)을 작성하고 어셈블리로 컴파일합니다. 유형 어셈블리는 사용자 정의 형식 구현을 위한 SQL Server 요구 사항을 따라야 합니다. 이렇게 하면 어셈블리를 SQL Server 인스턴스에 설치 및 등록할 수 있습니다. 자세한 내용은 CLR 사용자 정의 형식의 "Requirements for Implementing UDTs"를 참조하십시오.

  2. IXMLSerializable을 구현하지 않은 경우 XML 직렬화기에 수반되는 DLL을 생성하려면 유형 어셈블리 DLL에서 Sgen.exe를 실행합니다. 이 DLL의 이름은 MyType.XmlSerializers.dll과 비슷하게 지정합니다.

    CLR 사용자 정의 형식을 SQL Server에서 사용하기 위한 기본 요구 사항을 충족하는 것 외에도 SQL Server의 네이티브 XML 웹 서비스에서 사용할 수 있도록 CLR 사용자 정의 형식을 XML로 직렬화할 수 있어야 합니다. 자세한 내용은 CLR 사용자 정의 형식의 "XML Serialization"을 참조하십시오.

  3. CREATE ASSEMBLY를 사용하여 SQL Server 인스턴스에 유형 어셈블리 DLL을 설치합니다.

    IXMLSerializable을 구현하지 않고 2단계를 완료한 경우 CREATE ASSEMBLY를 사용하여 SQL Server 인스턴스에 XML 직렬화기에 수반되는 DLL도 설치해야 합니다.

  4. CLR 사용자 정의 형식을 XML에 직렬화하고 이를 이전 섹션에서 설명한 것과 비슷한 myEndpoint**::xml** 구조에 포함시킵니다.

    서버에 CLR 사용자 정의 형식을 설치한 다음 CLR 사용자 정의 형식의 항목을 네이티브 XML 웹 서비스 클라이언트 응용 프로그램의 SQL Server에 전달하려면 먼저 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);
    

    클라이언트에서 형식화되지 않은 XML로 CLR 사용자 정의 형식을 사용하는 경우 이 역직렬화 프로세스를 수행할 필요가 없습니다.

또한 CLR 사용자 정의 형식은 xml 데이터 형식에 대해 설명된 것과 같은 방식으로 매개 변수가 있는 쿼리에 대한 매개 변수로 전달될 수 있습니다. 해당 XML로 직렬화된 형식의 CLR 사용자 정의 형식은 myEndpoint**::xml** 유형을 사용하여 클라이언트로부터 전달되어야 합니다.

CLR 사용자 정의 형식을 포함하는 매개 변수가 있는 쿼리에서 여러 값이 System.Data.SqlClient.SqlParameter 구조에 설정됩니다. 예를 들어 다음 속성 설정은 CLR 사용자 정의 형식에 대해 사용됩니다.

  • SqlDbType 속성은 Udt 값으로 설정되어야 합니다.

  • ClrTypeName 속성은 SQL Server 인스턴스에 등록된 것과 같이 설치된 사용자 정의 형식의 세 부분으로 구성된 SQL Server 이름(MyDatabase**.MySchema.**MyUdtType)으로 설정되어야 합니다.