Share via


서버의 문서에 있는 데이터 액세스

Microsoft Office Word 또는 Microsoft Office Excel의 개체 모델을 사용하지 않고도 문서 수준 사용자 지정에서 데이터에 대해 프로그래밍할 수 있습니다. 즉, Word 또는 Excel이 설치되지 않은 서버의 문서에 포함된 데이터에 액세스할 수 있습니다. 예를 들어 ASP.NET 페이지와 같은 서버의 코드는 문서의 데이터를 사용자 지정하고 사용자 지정된 문서를 최종 사용자에게 보낼 수 있습니다. 최종 사용자가 문서를 열면 솔루션 어셈블리의 데이터 바인딩 코드가 사용자 지정된 데이터를 문서에 바인딩합니다. 이는 문서의 데이터가 사용자 인터페이스와 분리되어 있기 때문에 가능합니다. 자세한 내용은 문서 수준 사용자 지정의 캐시된 데이터를 참조하세요.

적용 대상: 이 항목의 정보는 Excel 및 Word의 문서 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 애플리케이션 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하세요.

서버에서 사용할 데이터 캐시

문서에서 데이터 개체를 캐시하려면 디자인 타임에 CachedAttribute 특성으로 표시하거나 런타임에 호스트 항목의 StartCaching 메서드를 사용합니다. 문서에서 데이터 개체를 캐시하는 경우 Visual Studio Tools for Office 런타임은 개체를 문서에 저장된 XML 문자열로 직렬화합니다. 개체는 캐싱에 적합한 특정 요구 사항을 충족해야 합니다. 자세한 내용은 캐시 데이터를 참조하세요.

서버 쪽 코드는 데이터 캐시의 모든 데이터 개체를 조작할 수 있습니다. 캐시된 데이터 인스턴스에 바인딩된 컨트롤은 사용자 인터페이스와 동기화되므로 클라이언트에서 문서를 열 때 데이터에 대한 서버 쪽 변경 내용이 자동으로 표시됩니다.

캐시의 데이터 액세스

콘솔 애플리케이션, Windows Forms 애플리케이션 또는 웹 페이지 등 Office 외부의 애플리케이션에서 캐시의 데이터에 액세스할 수 있습니다. 캐시된 데이터에 액세스하는 애플리케이션은 완전 신뢰가 있어야 합니다. 부분 신뢰가 있는 웹 응용 프로그램은 Office 문서에 캐시된 데이터를 삽입, 검색 또는 변경할 수 없습니다.

데이터 캐시는 ServerDocument 클래스의 CachedData 속성에 의해 노출되는 컬렉션의 계층 구조를 통해 액세스할 수 있습니다.

  • CachedData 속성은 문서 수준 사용자 지정에 캐시된 모든 데이터를 포함하는 CachedData 값을 반환합니다.

  • 각각 CachedDataHostItem하나 이상의 CachedData개체를 포함합니다. CachedDataHostItem에는 단일 클래스 내에 정의된 모든 캐시된 데이터 개체가 포함되어 있습니다.

  • 각각 CachedDataItem하나 이상의 CachedDataHostItem개체를 포함합니다. CachedDataItem은 캐시된 단일 데이터 개체를 나타냅니다.

    다음 코드 예제에서는 Excel 통합 문서 프로젝트의 Sheet1 클래스에서 캐시된 문자열에 액세스하는 방법을 보여 줍니다. 이 예제는 Save 메서드에 대해 제공된 큰 예제의 일부입니다.

    serverDocument1 = new ServerDocument(documentPath);
    CachedDataHostItem hostItem1 = 
        serverDocument1.CachedData.HostItems["ExcelWorkbook1.Sheet1"];
    CachedDataItem dataItem1 = hostItem1.CachedData["CachedString"];
    

캐시의 데이터 수정

캐시된 데이터 개체를 수정하려면 일반적으로 다음 단계를 수행합니다.

  1. 캐시된 개체의 XML 표현을 개체의 새 인스턴스로 역직렬화합니다. 캐시된 데이터 개체를 나타내는 CachedDataItemXml 속성을 사용하여 XML에 액세스할 수 있습니다.

  2. 이 복사본을 변경합니다.

  3. 다음 옵션 중 하나를 사용하여 변경된 개체를 데이터 캐시로 다시 직렬화합니다.

    • 변경 내용을 자동으로 직렬화하려면 SerializeDataInstance 메서드를 사용합니다. 이 메서드는 데이터 캐시의 DataSet, DataTable 및 형식화된 데이터 세트 개체 직렬화에 DiffGram 형식을 사용합니다. DiffGram 형식은 오프라인 문서의 데이터 캐시에 대한 변경 내용이 서버로 올바르게 전송되도록 합니다.

    • 캐시된 데이터를 변경하기 위해 자체 직렬화를 수행하려는 경우 Xml 속성에 직접 쓸 수 있습니다. DataAdapter를 사용해 DataSet이나 DataTable 또는 형식화된 데이터 세트의 데이터를 변경한 채로 데이터베이스를 업데이트하려면 DiffGram 형식을 지정합니다. 그렇지 않으면 기존 행을 수정하는 대신 새 행을 추가하는 방식을 통해 DataAdapter에서 데이터베이스를 업데이트합니다.

현재 값을 역직렬화하지 않고 데이터 수정

경우에 따라 현재 값을 먼저 역직렬화하지 않고 캐시된 개체의 값을 수정할 수 있습니다. 예를 들어 문자열 또는 정수와 같이 단순 형식의 개체 값을 변경하거나 서버의 문서에서 캐시된 DataSet 문서를 초기화하는 경우 이 작업을 수행할 수 있습니다. 이러한 경우 캐시된 개체의 현재 값을 먼저 역직렬화하지 않고 SerializeDataInstance 메서드를 사용할 수 있습니다.

다음 코드 예제에서는 Excel 통합 문서 프로젝트의 Sheet1 클래스에서 캐시된 문자열 값을 변경하는 방법을 보여 줍니다. 이 예제는 Save 메서드에 대해 제공된 큰 예제의 일부입니다.

serverDocument1 = new ServerDocument(documentPath);
CachedDataHostItem hostItem1 = 
    serverDocument1.CachedData.HostItems["ExcelWorkbook1.Sheet1"];
CachedDataItem dataItem1 = hostItem1.CachedData["CachedString"];

if (dataItem1 != null &&
    Type.GetType(dataItem1.DataType) == typeof(string))
{
    dataItem1.SerializeDataInstance("This is the new cached string value.");
    serverDocument1.Save();
}

데이터 캐시에서 null 값 수정

데이터 캐시는 문서를 저장하고 닫을 때 값이 null인 개체를 저장하지 않습니다. 이 제한은 캐시된 데이터를 수정할 때 다음과 같은 몇 가지 결과를 유발합니다.

  • 데이터 캐시의 개체를 null 값으로 설정하면 문서가 열릴 때 데이터 캐시의 모든 개체가 자동으로 null로 설정되고 문서가 저장되고 닫히면 전체 데이터 캐시가 지워집니다. 즉, 캐시된 모든 개체가 데이터 캐시에서 제거되고 CachedData 컬렉션이 빈 상태가 됩니다.

  • 데이터 캐시에서 null 개체를 사용하여 솔루션을 빌드하고 문서를 처음으로 열기 전에 ServerDocument 클래스를 사용하여 이러한 개체를 초기화하려는 경우 데이터 캐시의 모든 개체를 초기화해야 합니다. 일부 개체만 초기화하면 문서를 열 때 모든 개체가 null로 설정되고 문서를 저장하고 닫을 때 전체 데이터 캐시가 지워집니다.

캐시의 형식화된 데이터 세트에 액세스

Office 솔루션과 Office 외부 애플리케이션(예: Windows Forms 응용 프로그램 또는 ASP.NET 프로젝트)에서 형식화된 데이터 세트의 데이터에 액세스하려면 두 프로젝트에서 참조되는 별도의 어셈블리에서 형식화된 데이터 세트를 정의해야 합니다. 데이터 원본 구성 마법사 또는 데이터 세트 디자이너를 사용하여 각 프로젝트에 형식화된 데이터 세트를 추가하는 경우, .NET Framework 두 프로젝트의 형식화된 데이터 세트를 다른 형식으로 처리합니다. 형식화된 데이터 세트를 만드는 방법에 대한 자세한 내용은 Visual Studio에서 데이터 세트 만들기 및 구성을 참조하세요.