概述

存储目录在Leadtools.Medical.Storage.DataAccessLayer.dll程序集中定义。 该目录定义了Leadtools.Medical.Storage.DataAccessLayer类和数据库模式之间的映射,并包含数据库模式中所有表名称的定义以及每个表的所有列。 所有存储目录被定义为一个xml文件。下面的教程将为教程数据库创建一个存储目录。

在此之前,请先确认,您已经为数据库中的每个表定义从CatalogEntity类派生的类。 比如,在本教程中,我们定义了四个类(每个表一个)。 存储目录链接到以下四个类:

  • class MyPatient : CatalogEntity
  • class MyStudy : CatalogEntity
  • class MySeries : CatalogEntity
  • class MyInstance : CatalogEntity

目录的结构由一个或多个元素组成,后跟一个或多个元素。 每个元素对应一个数据库表。 每个元素对应一个列。

<CatalogDataSet> 
      <Entity>...</Entity> 
      <Entity>...</Entity> 
      ... 

      <Element>...</Element> 
      <Element>...</Element> 
      ... 
</CatalogDataSet>

您必须为数据库定义存储目录。对于教程中的数据库结构,有四个表。下面这些是每个表的元素:

<Entity> 
    <EntityKey>PatientTableEntityKey</EntityKey> 
    <EntityName>MyPatientTable</EntityName> 
    <DisplayName>MyPatientTable</DisplayName> 
  </Entity> 

  <Entity> 
    <EntityKey>StudyTableEntityKey</EntityKey> 
    <EntityName>MyStudyTable</EntityName> 
    <DisplayName>MyStudyTable</DisplayName> 
  </Entity> 

  <Entity> 
    <EntityKey>SeriesTableEntityKey</EntityKey> 
    <EntityName>MySeriesTable</EntityName> 
    <DisplayName>MySeriesTable</DisplayName> 
  </Entity> 

  <Entity> 
    <EntityKey>InstanceTableEntityKey</EntityKey> 
    <EntityName>MyInstanceTable</EntityName> 
    <DisplayName>MyInstanceTable</DisplayName> 
  </Entity>

每个元素的描述如下:

Element 描述
<EntityKey> 任何唯一标识该表的名称。定义MyPatient类时,CatalogKey属性必须返回此处定义的名称。
<EntityName> 保存患者信息的数据库表的名称。对于教程数据库,患者表称为MyPatient。
<DisplayName> 不使用

数据库结构中的每个表列必须有一个\元素可以查询。 例如,在存储服务器管理器的数据库管理器中,您可以查询以下字段,因此所有存储目录中都必须具有相应的\元素。

查询字段 对于的数据表 对应列
Patient Last Name MyPatientTable PatientName
PatientFirst Name MyPatientTable PatientName
Patient ID MyPatientTable PatientIdentification
Modality MySeriesTable SeriesModality
Study ID MyStudyTable StudyStudyId
Study Accession # MyStudyTable StudyAccessionNumber
Referring Physician
Last Name
MyStudyTable StudyReferringPhysiciansName
Referring Physician
Given Name
MyStudyTable StudyReferringPhysiciansName
Studies Date From MyStudyTable StudyStudyDate
Studies Date To MyStudyTable StudyStudyDate
Storage Date MyInstanceTable ImageLastStoreDate
Series Description SeriesModality SeriesSeriesDescription

对于本教程来说,四个表中每个表的主键都是自动生成的主键。 这些是唯一没有相应的元素的列。

例如,MyPatientTable有七列,所以目录中将有六个元素(因为MyPatientTable.PatientId不是直接查询 - 因此没有定义元素)。

<Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientIdentification</ElementKey> 
      <ElementName>PatientIdentification</ElementName> 
      <DisplayName>Patient ID</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientName</ElementKey> 
      <ElementName>PatientName</ElementName> 
      <DisplayName>Family Name</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientBirthday</ElementKey> 
      <ElementName>PatientBirthday</ElementName> 
      <DisplayName>Birth Date</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientSex</ElementKey> 
      <ElementName>PatientSex</ElementName> 
      <DisplayName>Sex</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientComments</ElementKey> 
      <ElementName>PatientComments</ElementName> 
      <DisplayName>Comments</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element>

每个元素的描述如下:

Element 描述
<EntityKey> 该元素所属的表名<EntityKey>,对于患者表,这是“PatientTableEntityKey”
<ElementKey> MyPatient,MyStudy,MySeries,MyInstance类属性使用[EntityElementAttribute]属性进行装饰。 值必须与其中一个属性相同
<ElementName> 必须是相应表格的列名称
<DisplayName> 不使用
<KeyElement> 如果是主键则为true,否则为false

对于本教程,存储目录的名称是MyCatalog.xml。

存储目录的完整路径在两个配置文件中指定:

  1. CSStorageServerManagerDemo.exe.config
  2. Leadtools.Dicom.Server.exe.config

这是需要添加到每个配置文件的内容:

<configSections> 
    <section name="xmlStorageCatalogSettings" type="Leadtools.Medical.Storage.DataAccessLayer.XmlStorageCatalogSettings, Leadtools.Medical.Storage.DataAccessLayer" /> 
  </configSections> 
  <xmlStorageCatalogSettings catalogPath="C:\LEADTOOLS 20\Bin\Dotnet4\Win32\MyCatalog.xml"/>

最终,MyCatalog.xml的内容如下:

<CatalogDataSet> 
  <Entity> 
    <!--A name that uniquely identifies the patient table--> 
    <EntityKey>PatientTableEntityKey</EntityKey>  

    <!--Name of database table that holds the patient information-->    
    <EntityName>MyPatientTable</EntityName>   

    <!-- Not used-->        
    <DisplayName>MyPatientTable</DisplayName>       
  </Entity> 

  <Entity> 
    <EntityKey>StudyTableEntityKey</EntityKey> 
    <EntityName>MyStudyTable</EntityName> 
    <DisplayName>MyStudyTable</DisplayName> 
  </Entity> 

  <Entity> 
    <EntityKey>SeriesTableEntityKey</EntityKey> 
    <EntityName>MySeriesTable</EntityName> 
    <DisplayName>MySeriesTable</DisplayName> 
  </Entity> 

  <Entity> 
    <EntityKey>InstanceTableEntityKey</EntityKey> 
    <EntityName>MyInstanceTable</EntityName> 
    <DisplayName>MyInstanceTable</DisplayName> 
  </Entity> 

   <Element> 
<!-- Table name to which the element belongs --> 
      <EntityKey>PatientTableEntityKey</EntityKey>  

<!-- The MyPatient class properties are decorated with an [EntityElementAttribute] attribute. This must be identical to one of these properties. --> 
      <ElementKey>PatientIdentification</ElementKey>   

<!-- Must be a column name of the corresponding table --> 
      <ElementName>PatientIdentification</ElementName>   

<!-- Not used --> 
      <DisplayName>Patient ID</DisplayName>  

<!-- True if a primary key; false otherwise -->             
      <KeyElement>false</KeyElement>                     
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientName</ElementKey> 
      <ElementName>PatientName</ElementName> 
      <DisplayName>Family Name</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientBirthday</ElementKey> 
      <ElementName>PatientBirthday</ElementName> 
      <DisplayName>Birth Date</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientSex</ElementKey> 
      <ElementName>PatientSex</ElementName> 
      <DisplayName>Sex</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>PatientTableEntityKey</EntityKey> 
      <ElementKey>PatientComments</ElementKey> 
      <ElementName>PatientComments</ElementName> 
      <DisplayName>Comments</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>SeriesTableEntityKey</EntityKey> 
      <ElementKey>SeriesSeriesInstanceUID</ElementKey> 
      <ElementName>SeriesSeriesInstanceUID</ElementName> 
      <DisplayName>Series Instance UID</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>SeriesTableEntityKey</EntityKey> 
      <ElementKey>SeriesModality</ElementKey> 
      <ElementName>SeriesModality</ElementName> 
      <DisplayName>Modality</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>SeriesTableEntityKey</EntityKey> 
      <ElementKey>SeriesSeriesNumber</ElementKey> 
      <ElementName>SeriesSeriesNumber</ElementName> 
      <DisplayName>Series Number</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>SeriesTableEntityKey</EntityKey> 
      <ElementKey>SeriesSeriesDate</ElementKey> 
      <ElementName>SeriesSeriesDate</ElementName> 
      <DisplayName>Series Date</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>SeriesTableEntityKey</EntityKey> 
      <ElementKey>SeriesSeriesDescription</ElementKey> 
      <ElementName>SeriesSeriesDescription</ElementName> 
      <DisplayName>Series Description</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>SeriesTableEntityKey</EntityKey> 
      <ElementKey>SeriesBodyPartExamined</ElementKey> 
      <ElementName>SeriesBodyPartExamined</ElementName> 
      <DisplayName>Body Part Examined</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>StudyTableEntityKey</EntityKey> 
      <ElementKey>StudyStudyInstanceUID</ElementKey> 
      <ElementName>StudyStudyInstanceUID</ElementName> 
      <DisplayName>Study Instance UID</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>StudyTableEntityKey</EntityKey> 
      <ElementKey>StudyStudyDate</ElementKey> 
      <ElementName>StudyStudyDate</ElementName> 
      <DisplayName>Study Date</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>StudyTableEntityKey</EntityKey> 
      <ElementKey>StudyAccessionNumber</ElementKey> 
      <ElementName>StudyAccessionNumber</ElementName> 
      <DisplayName>Accession Number</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>StudyTableEntityKey</EntityKey> 
      <ElementKey>StudyStudyId</ElementKey> 
      <ElementName>StudyStudyId</ElementName> 
      <DisplayName>Study ID</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
  <Element> 
    <EntityKey>StudyTableEntityKey</EntityKey> 
    <ElementKey>StudyReferringPhysiciansName</ElementKey> 
    <ElementName>StudyReferringPhysiciansName</ElementName> 
    <DisplayName>Referring Physician</DisplayName> 
    <KeyElement>false</KeyElement> 
  </Element> 
   <Element> 
      <EntityKey>StudyTableEntityKey</EntityKey> 
      <ElementKey>StudyStudyDescription</ElementKey> 
      <ElementName>StudyStudyDescription</ElementName> 
      <DisplayName>Study Description</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>InstanceTableEntityKey</EntityKey> 
      <ElementKey>SOPInstanceUID</ElementKey> 
      <ElementName>SOPInstanceUID</ElementName> 
      <DisplayName>SOP Instance UID</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>InstanceTableEntityKey</EntityKey> 
      <ElementKey>ImageImageNumber</ElementKey> 
      <ElementName>ImageImageNumber</ElementName> 
      <DisplayName>Instance Number</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
  <Element> 
    <EntityKey>InstanceTableEntityKey</EntityKey> 
    <ElementKey>ImageLastStoreDate</ElementKey> 
    <ElementName>ImageLastStoreDate</ElementName> 
    <DisplayName>Receive Date</DisplayName> 
    <KeyElement>false</KeyElement> 
  </Element> 
   <Element> 
      <EntityKey>InstanceTableEntityKey</EntityKey> 
      <ElementKey>ImageFilename</ElementKey> 
      <ElementName>ImageFilename</ElementName> 
      <DisplayName>Referenced File</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
   <Element> 
      <EntityKey>InstanceTableEntityKey</EntityKey> 
      <ElementKey>ImageUniqueSOPClassUID</ElementKey> 
      <ElementName>ImageUniqueSOPClassUID</ElementName> 
      <DisplayName>SOP Class UID</DisplayName> 
      <KeyElement>false</KeyElement> 
   </Element> 
  <Element> 
    <EntityKey>InstanceTableEntityKey</EntityKey> 
    <ElementKey>ImageRows</ElementKey> 
    <ElementName>ImageRows</ElementName> 
    <DisplayName>Rows</DisplayName> 
    <KeyElement>false</KeyElement> 
  </Element> 
  <Element> 
    <EntityKey>InstanceTableEntityKey</EntityKey> 
    <ElementKey>ImageColumns</ElementKey> 
    <ElementName>ImageColumns</ElementName> 
    <DisplayName>Cols</DisplayName> 
    <KeyElement>false</KeyElement> 
  </Element> 
  <Element> 
    <EntityKey>InstanceTableEntityKey</EntityKey> 
    <ElementKey>ImageBitsAllocated</ElementKey> 
    <ElementName>ImageBitsAllocated</ElementName> 
    <DisplayName>Bits Allocated</DisplayName> 
    <KeyElement>false</KeyElement> 
  </Element>

了解更多

这是本系列的第四篇文章,本文介绍了LEAD医学存储服务器数据库的存储目录结构,我们将在《LEAD医疗存储服务器自定义数据库系列教程 – 数据库查询》系列的第五篇文章中,着重介绍LEAD医用存储服务器数据库的数据查询方式。

系列文章