다음을 통해 공유


스키마 섹션

스키마 섹션이 필요합니다. 이전 예제에서 알 수 있듯이 ADO는 업데이트 시 데이터 값의 의미 체계를 최대한 유지하기 위해 각 열에 대한 자세한 메타데이터를 작성합니다. 그러나 XML 로드에는 ADO에는 열 이름과 열이 속한 행 집합만 필요합니다. 다음은 최소 스키마의 예입니다.

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"  
    xmlns:rs="urn:schemas-microsoft-com:rowset"  
    xmlns:z="#RowsetSchema">  
  <s:Schema id="RowsetSchema">  
    <s:ElementType name="row" content="eltOnly">  
      <s:AttributeType name="ShipperID"/>  
      <s:AttributeType name="CompanyName"/>  
      <s:AttributeType name="Phone"/>  
      <s:Extends type="rs:rowbase"/>  
    </s:ElementType>  
  </s:Schema>  
  <rs:data>  
...  
  </rs:data>  
</xml>  

이전 예제에서 ADO는 스키마에 형식 정보가 포함되지 않으므로 데이터를 가변 길이 문자열로 처리합니다.

열 이름의 별칭 만들기

rs:name 특성을 사용하면 행 집합에 의해 노출되는 열 정보에 친숙한 이름이 표시되고 데이터 섹션에서 더 짧은 이름을 사용할 수 있도록 열 이름에 대한 별칭을 만들 수 있습니다. 예를 들어 다음과 같이 ShipperID를 s1, CompanyName을 s2로, Phone을 s3로 매핑하도록 이전 스키마를 수정할 수 있습니다.

<s:Schema id="RowsetSchema">   
<s:ElementType name="row" content="eltOnly" rs:updatable="true">   
<s:AttributeType name="s1" rs:name="ShipperID" rs:number="1" ...>   
...  
</s:AttributeType>   
<s:AttributeType name="s2" rs:name="CompanyName" rs:number="2" ...>   
...  
</s:AttributeType>   
<s:AttributeType name="s3" rs:name="Phone" rs:number="3" ...>   
...  
</s:AttributeType>   
...  
</s:ElementType>   
</s:Schema>  

그런 다음, 데이터 섹션에서 행은 이름 특성(rs:name 아님)을 사용하여 해당 열을 참조합니다.

"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/>  

열 이름이 XML에서 유효한 특성 또는 태그 이름이 아닐 때마다 열 이름에 대한 별칭을 만들어야 합니다. 예를 들어 공백이 포함된 이름은 잘못된 특성이므로 “LastName”에는 별칭이 있어야 합니다. 다음 줄은 XML 파서에서 올바르게 처리되지 않으므로 포함된 공간이 없는 다른 이름에 대한 별칭을 만들어야 합니다.

<row last name="Jones"/>  

이름 특성에 사용하는 모든 값은 XML 문서의 스키마 및 데이터 섹션 모두에서 열이 참조되는 각 위치에서 일관되게 사용해야 합니다. 다음 예제에서는 일관된 s1 사용을 보여 줍니다.

<s:Schema id="RowsetSchema">  
  <s:ElementType name="row" content="eltOnly">  
    <s:attribute type="s1"/>  
    <s:attribute type="CompanyName"/>  
    <s:attribute type="s3"/>  
    <s:extends type="rs:rowbase"/>  
  </s:ElementType>  
  <s:AttributeType name="s1" rs:name="ShipperID" rs:number="1"   
    rs:maydefer="true" rs:writeunknown="true">  
    <s:datatype dt:type="i4" dt:maxLength="4" rs:precision="10"   
      rs:fixedlength="true" rs:maybenull="true"/>  
  </s:AttributeType>  
</s:Schema>  
<rs:data>  
  <z:row s1="1" CompanyName="Speedy Express" s3="(503) 555-9831"/>  
</rs:data>  

마찬가지로 이전 예제의 CompanyName에는 정의된 별칭이 없으므로 CompanyName은(는) 문서 전체에서 일관되게 사용해야 합니다.

데이터 형식

dt:type 특성을 사용하여 열에 데이터 형식을 적용할 수 있습니다. 허용되는 XML 형식에 대한 최종 가이드는 W3C XML-Data 사양의 데이터 형식 섹션을 참조하세요. 두 가지 방법으로 데이터 형식을 지정할 수 있습니다. 즉, 열 정의 자체에서 직접 dt:type 특성을 지정하거나 s:datatype 구문을 열 정의의 중첩 요소로 사용할 수 있습니다. 예를 들면 다음과 같습니다.

<s:AttributeType name="Phone" >  
  <s:datatype dt:type="string"/>  
</s:AttributeType>  

위의 식은 아래의 식과 동일합니다.

<s:AttributeType name="Phone" dt:type="string"/>  

행 정의에서 dt:type 특성을 완전히 생략하면 기본적으로 열의 형식은 가변 길이 문자열이 됩니다.

단순히 형식 이름(예: dt:maxLength)보다 더 많은 형식 정보가 있는 경우 s:datatype 자식 요소를 더 읽기 쉽게 만듭니다. 그러나 이것은 단지 규칙일 뿐이며 요구 사항은 아닙니다.

다음 예제에서는 스키마에 형식 정보를 포함하는 방법을 자세히 보여 줍니다.

<!-- 1. String with no max length -->  
<s:AttributeType name="title_id"/>  
<!-or -->  
<s:AttributeType name="title_id" dt:type="string"/>  
  
<!-- 2. Fixed length string with max length of 6 -->  
<s:AttributeType name="title_id">  
    <s:datatype dt:type="string" dt:maxLength="6" rs:fixedlength="true" />  
</s:AttributeType>  
  
<!-- 3. Variable length string with max length of 6 -->  
<s:AttributeType name="title_id">  
    <s:datatype dt:type="string" dt:maxLength="6" />  
</s:AttributeType>  
  
<!-- 4. Integer -->  
<s:AttributeType name="title_id" dt:type="int"/>  

두 번째 예제에서는 rs:fixedlength 특성을 절묘하게 사용합니다. rs:fixedlength 특성이 true로 설정된 열은 데이터에 스키마에서 정의된 길이가 있어야 함을 의미합니다. 이 경우 유효한 title_id 값은 “123456”이며, 있는 그대로 “123”입니다. 그러나 “123”은 길이가 6이 아니라 3이므로 유효하지 않습니다. fixedlength 속성에 대한 자세한 설명은 OLE DB 프로그래머 가이드를 참조하세요.

Null 처리

Null 값은 rs:maybenull 특성에 의해 처리됩니다. 이 특성을 true로 설정하면 열 내용에 null 값이 포함될 수 있습니다. 또한 열이 데이터 행에 없는 경우 행 집합에서 데이터를 다시 읽는 사용자는 IRowset::GetData()에서 null 상태를 가져옵니다. Shippers 테이블에서 다음 열 정의를 고려합니다.

<s:AttributeType name="ShipperID">  
  <s:datatype dt:type="int" dt:maxLength="4"/>  
</s:AttributeType>  
<s:AttributeType name="CompanyName">  
  <s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="true"/>  
</s:AttributeType>  

정의에 의해 CompanyName이(가) null일 수 있지만 ShipperID에는 null 값이 포함될 수는 없습니다. 데이터 섹션에 다음 행이 포함된 경우 지속성 공급자는 CompanyName 열의 데이터 상태를 OLE DB 상태 상수 DBSTATUS_S_ISNULL로 설정합니다.

<z:row ShipperID="1"/>  

행이 완전히 비어 있는 경우 다음과 같이 지속성 공급자는 ShipperID의 경우DBSTATUS_E_UNAVAILABLE, CompanyName의 경우 DBSTATUS_S_ISNULL의 OLE DB 상태를 반환합니다.

<z:row/>   

길이가 0인 문자열은 null과 동일하지 않습니다.

<z:row ShipperID="1" CompanyName=""/>  

이전 행의 경우 지속성 공급자는 두 열에 대해 DBSTATUS_S_OK OLE DB 상태를 반환합니다. 이 경우 CompanyName은(는) 단순히 “”(길이가 0인 문자열)입니다.

OLE DB용 XML 문서의 스키마 내에서 사용할 수 있는 OLE DB 구문에 대한 자세한 내용은 “urn:schemas-microsoft-com:rowset” 정의 및 OLE DB 프로그래머 가이드를 참조하세요.

참고 항목

XML 형식으로 레코드 유지