如何使用LEADTOOLS自定义LEADTOOLS MWL数据库

在本教程中,您将通过在现有数据库中的表中添加两个新列来自定义数据库。 然后创建一个Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent 对象来查询和更新新列。最后,您将将新列映射到相应DICOM元素用于客户端查询响应。

发布于 2017/03/22 00:00

在本教程中,您将通过在现有数据库中的表中添加两个新列来自定义数据库。 然后创建一个Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent 对象来查询和更新新列。最后,您将将新列映射到相应

有关完整的工作演示程序和包含以下步骤的源代码,请参阅  在<安装目录>\Bin\Dotnet4\Win32 中的CustomizingWorklistDAL 演示程序 和在<安装目录>\Examples\Dotnet\.

中的源代码

注意:这些任务和代码段假设您已经创建并配置了基本的模态工作列表数据库,并且存在有效的连接。 LEADTOOLS提供Microsoft SQL Server Compact Edition数据库文件供您在必要时使用。 这些文件名为LeadDicomWorklist32.sdf和LeadDicomWorklist64.sdf。 它们分别对应32位和64位,位于C:\ Users \ Public \ Documents中。 选择适合您的应用程序和环境的数据库

  1. 要创建的两个新列是“Patient”表中的“SmokingStatus”列和“ScheduledProcedureStep”表中的“CommentsOnTheScheduledProcedureStep”。 两个新列将映射到以下DICOM元素:

    • Smoking Status(0010,21A0)
    • Procedure Step Comments on the Scheduled(0040,0400)

    你可以使用SQL Enterprise Manager等可视化工具将新列添加到数据库中的相应表中。 或者,您可以使用以下SQL命令:

                 alter table [Patient] add [SmokingStatus]nvarchar(10)
                 alter table [ScheduledProcedureStep] add [CommentOnTheSchedulerProcedureStep] nvarchar(400)
                 
    

     

  2. 为表示要映射到它们的元素的实际https://www.leadtools.com/help/leadtools/v19/dh/to/leadtools.topics.dicom~di.topics.defaultvaluerepresentationtable.html的数据库列选择有效的数据类型
  3. 使用 https://www.leadtools.com/help/leadtools/v19/dh/mwd/leadtools.medical.worklist.dataaccesslayer~leadtools.medical.worklist.dataaccesslayer.iworklistdataaccessagent.html 对象查询并将新值插入到“SmokingStatus”和“CommentsOnTheScheduleProcedureStep”列中的新字段中。以下代码完成了这些任务。 此代码假定您已经成功地创建并配置了基本的Modality Worklist数据库,并且有一个有效的数据库连接。 以下代码完成了这些任务。 此代码假定您已经成功地创建并配置了基本的Modality Worklist数据库,并且有一个有效的数据库连接。
    [C#]
                  private void QueryWorklistItems ()
                  {
                     IWorklistDataAccessAgent agent = GetDataAccessAgent() ;
                     
                     MWLDataset queryResults = agent.QueryModalityWorklists(new MatchingParameterCollection(), new StringCollection());
                     
                     if (queryResults.Patient.Rows.Count > 0)
                     {
                        queryResults.Patient[0] ["SmokingStatus"] = "UNKNOWN";
                     }
                     
                     if (queryResults.ScheduledProcedureStep.Rows.Count > 0)
                     {
                        queryResults.ScheduledProcedureStep[0] ["CommentsOnTheScheduledProcedureStep"] = "Some comments on the procedure
                     }
                     
                     agent.UpdateMWL(queryResults);
                  }
                
                  private IWorklistDataAccessAgent GetDataAccessAgent()
                  {
                        WorklistDataAccessConfigurationView view = new WorklistDataAccessConfigurationView();
                        IWorklistDataAccessAgent agent;
                        
                        string connectionString = view.GetConnectionStringSettings().ConnectionString;
                        string provider         = view.GetConnectionStringSettings().ProviderName;
                        
                        if (provider == DataAccessMapping.DefaultSqlProviderName)
                        {
                           agent    = new WorklistSqlDbDataAccessAgent (connectionString);
                        }
                        else if (provider == DataAccessMapping.DefaultSqlCe3_5ProviderName)
                        {
                           agent    = new WorklistSqlCeDataAccessAgent(connectionString);
                        }
                        else
                        {
                           throw new NotImplementedException();
                        }
                        
                        return agent;
                  }
                         
    
  4. 现在,Leadtools.Medical.Worklist.DataAccessLayer.IWorklistDataAccessAgent 对象能够查询和更新您创建的新列, 您需要在DICOM C-Find响应中支持这些列。 ModalityWorklistAddIn 使用uses the

    Leadtools.Dicom.Scp.Command.MWLCFindCommand 有一个静态属性, Leadtools.Dicom.Scp.Command.MWLCFindCommand.DefualtMWLIOD, 会返回一个流. 流是一个包含DICOM Modality Worklist IOD元素的XML文件并告知

     

  5. 使用下面代码将MWL IOD stream 写入磁盘:
    [C#]
                  using (Stream iodStream = MWLCFindCommand.DefualtMWLIOD)
                  {
                      using (FileStream customIODStream = new FileStream(_iodPath, FileMode.Create))
                      {
                         int readCount;
                         var buffer = new byte[8192];
                         while((readCount = iodStream.Read(buffer, 0, buffer.Length)) != 0)
                         {
                         customIODStream.Write(buffer, 0, readCount);
                         }
                      }
                  }
                     
    
  6. 在任何文本编辑器中打开新的xml文件,并找到SmokingStatus和ScheduledProcedureStep元素。 使用新值更新tableName和columnsName属性:
    • <element tag="(0010,21a0)" tagName="SmokingStatus" vr="CS" minVM="1" maxVM="1" vmDivider="1" returnType="Type3" matchingType="NotApplicable" returning="true" tableName="Patient" matchingEntity="" columnsName="SmokingStatus" />
    • <element tag="(0040,0400)" tagName="CommentsOnTheScheduledProcedureStep" vr="LT" minVM="1" maxVM="1" vmDivider="1" returnType="Type3" matchingType="NotApplicable" returning="true" tableName="ScheduledProcedureStep" matchingEntity="" columnsName="CommentsOnTheScheduledProcedureStep" />
  7. 您应该根据schema验证您的新XML文件。 使用以下代码验证新的XML文件:
    [C#]
                  private static void ValidateDocument(string iodPath)
                  {
                     XmlSchema         mwlSchema;
                     XmlReaderSettings settings;
                     
                     mwlSchema = MWLCFindCommand.IODSchema;
                     
                     settings = new XmlReaderSettings();
                     
                     settings.Schemas.Add(mwlSchema);
                     settings.ValidationType = ValidationType.Schema;
                     
                     settings.ValidationEventHandler += new ValidationEventHandler(schemaValidationHandler);
                     
                     using (XmlReader reader = XmlTextReader.Create(iodPath, settings))
                     {
                        while (reader.Read());
                     }
                  }
                  private static void schemaValidationHandler(object sender, ValidationEventArgs args) 
                  {
                     throw args.Exception;
                  }
                     
    
  8. 将这个新文件用于https://www.leadtools.com/help/leadtools/v19/dh/dsp/leadtools.dicom.scp~leadtools.dicom.scp.command.mwlcfindcommand.html. 在ModalityWorklistAddIn 加载项中使用如下代码:
    [C#]
                  MWLCFindCommand command = new MWLCFindCommand(clientSession, requestDS, GetDataAccessAgent());
                  AutoResetEvent resetEvent = new AutoResetEvent(false);
                  command.MWLConfiguration.ModalityWorklistIODPath = _iodPath;
                        
                  command.Execute(resetEvent);
                     
    

 

以下是MWL IOD文件中的属性的注释和说明:

  • Modality Work-list IOD的所有元素都列在文档中。
  • 元素应依据DICOM规范根据标签号进行排序。
  • MWLCFindCommand命令将根据IOD验证数据集请求,因此如果排序不正确,则会在运行时发生验证错误。
  • 可以添加额外的DICOM元素或私人元素,但是新元素应该以正确的排序顺序放置
  • 使用XML标签<element>将单独DICOM元素添加到文档
  • 使用XML标签<sequence>将Sequence DICOM元素添加到文档
  • Sequence Item DICOM元素被添加到具有XML标签<item>的文档中,它们必须只出现在<sequence>标签之后。
  • IOD由schema定义,当更新IOD时,应确保它根据schema的定义是有效的。

以下是对<element>和<sequence> XML标签的解释:

             <element  tag="" tagName="" vr="" minVM="" maxVM="" vmDivider="" returnType="" matchingType="" returning="" tableName="" matchingEntity="" columnsName="" />
             <sequence tag="" tagName="" vr="SQ" minVM="" maxVM="" vmDivider="" returnType="" returning="" tableName="">
             
  • tag:元素的DICOM标签:这是定义该标签对应的DICOM元素的最重要的标签。
  • tagName:这可以是任何人们可读的名称。
  • vr:将用于验证请求值的DICOM值表示。
  • MinVM:用于验证的最小值多重性。
  • MaxVM:用于验证的最大值多重性。
  • vmDivider:值的多重性的步长。
  • returnType:DICOM返回类型(检查允许值的模式),用于验证type1的元素在返回和删除不具有响应值的type3元素时具有值。
  • matchingType:DICOM匹配类型(检查允许值的模式),用于告诉MWL命令如何对每个元素执行匹配。
  • returning:告诉MWL命令是否应该在响应中返回元素。
  • tableName:告诉MWL命令ADO.NET表中存在此元素。
  • ColumnsName:告诉MWL命令ADO.NET DataColumn(其中应该获取此DICOM元素的值)。
  • matchingEntity:如果matchType的值是“NotApplicable”以外的任何值,则在与MWL数据访问层进行通信时,该值应填充用作匹配参数的对象。

关于葡萄城

葡萄城是专业的软件开发技术和低代码平台提供商,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。葡萄城开发技术始于1980年,40余年来始终聚焦软件开发技术,有深厚的技术积累和丰富的产品线。是业界能够同时赋能软件开发和低代码开发的企业。凭借过硬的产品能力、活跃的用户社区和丰富的伙伴生态,与超过3000家合作伙伴紧密合作,产品广泛应用于信息和软件服务、制造、交通运输、建筑、金融、能源、教育、公共管理等支柱产业。

推荐相关案例
推荐相关资源
关注微信
葡萄城社区二维码

关注“葡萄城社区”

加微信获取技术资讯

加微信获取技术资讯

想了解更多信息,请联系我们, 随时掌握技术资源和产品动态