概述

本文将主要介绍LEAD存储服务器数据库的数据查询方式,LEAD存储服务器数据库和教程数据库的数据库查询都遵循相同的模式:

  • 为每个表创建一个临时表的主键(#PrimaryKeys)
  • 插入#PrimaryKeys所有满足SELECT语句的键
  • 可以包含一个WHERE语句
  • 从#PrimaryKeys中选择MyPatientTable中的所有字段
  • 从#PrimaryKeys中选择来自MyStudyTable的所有字段
  • 从#PrimaryKeys中选择来自MySeriesTable的所有字段
  • 从#PrimaryKeys中选择来自MyInstanceTable的所有字段
  • 删除临时表

示例查询如下所示:

示例查询

假设您想构建一个查询,该查询返回包含“Smith”的所有患者姓名,其中PatientSex为“M”。 查询与上面的示例查询完全相同,但增加了WHERE语句:

示例查询

在为每个数据库表定义存储目录和CatalogEntity类(对于本教程为MyPatient,MyStudy,MySeries和MyInstance)之后,可以使用Leadtools.Medical.DataAccessLayer.SqlProviderUtilities.GenerateWhereStatement()方法来生成WHERE查询语句。

我们为本教程创建的MyStorageSqlDataAccessAgent类将覆盖许多用于创建SQL命令的StorageSqlDbDataAccessAgent方法。 下面显示了准备SQL查询(不包括SQL WHERE语句)的每个示例,以便您可以了解如何构建这些查询方式。

protected override void PreparePatientsQueryCommand

BEGIN

SET NOCOUNT ON

CREATE TABLE \#PrimaryKeys ( PatientId [int], StudyId [int], SeriesId [int],
ImageId [int] )

INSERT INTO \#PrimaryKeys

SELECT MyPatientTable.PatientId, MyStudyTable.StudyId, MySeriesTable.SeriesId,
MyInstanceTable.ImageId

FROM MyPatientTable

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyPatientId =
MyPatientTable.PatientId

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesStudyId =
MyStudyTable.StudyId

LEFT OUTER JOIN MyInstanceTable ON MyInstanceTable.ImageSeriesId =
MySeriesTable.SeriesId

SET NOCOUNT OFF

SELECT \* FROM MyPatientTable WHERE PatientId IN ( SELECT PatientId FROM
\#PrimaryKeys )

DROP TABLE \#PrimaryKeys

END

**protected override void PrepareStudiesQueryCommand**

BEGIN

SET NOCOUNT ON

CREATE TABLE \#PrimaryKeys ( PatientId [int], StudyId [int], SeriesId [int],
ImageId [int] )

INSERT INTO \#PrimaryKeys

SELECT MyPatientTable.PatientId, MyStudyTable.StudyId, MySeriesTable.SeriesId,
MyInstanceTable.ImageId

FROM MyStudyTable

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesStudyId =
MyStudyTable.StudyId

LEFT OUTER JOIN MyInstanceTable ON MyInstanceTable.ImageSeriesId =
MySeriesTable.SeriesId

SET NOCOUNT OFF

SELECT \* FROM MyPatientTable WHERE PatientId IN ( SELECT PatientId FROM
\#PrimaryKeys )

SELECT \* FROM MyStudyTable WHERE StudyId IN ( SELECT StudyId FROM \#PrimaryKeys
)

DROP TABLE \#PrimaryKeys

END

protected override void PrepareSeriesQueryCommand

BEGIN

SET NOCOUNT ON

CREATE TABLE \#PrimaryKeys ( PatientId [int], StudyId [int], SeriesId [int],
ImageId [int] )

INSERT INTO \#PrimaryKeys

SELECT MyPatientTable.PatientId, MyStudyTable.StudyId, MySeriesTable.SeriesId,
MyInstanceTable.ImageId

FROM MySeriesTable

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyId =
MySeriesTable.SeriesStudyId

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId

LEFT OUTER JOIN MyInstanceTable ON MyInstanceTable.ImageSeriesId =
MySeriesTable.SeriesId

SET NOCOUNT OFF

SELECT \* FROM MyPatientTable WHERE PatientId IN ( SELECT PatientId FROM
\#PrimaryKeys )

SELECT \* FROM MyStudyTable WHERE StudyId IN ( SELECT StudyId FROM \#PrimaryKeys
)

SELECT \* FROM MySeriesTable WHERE SeriesId IN ( SELECT SeriesId FROM
\#PrimaryKeys )

DROP TABLE \#PrimaryKeys

END

protected override void PrepareInstanceQueryCommand

BEGIN

SET NOCOUNT ON

CREATE TABLE \#PrimaryKeys ( PatientId [int], StudyId [int], SeriesId [int],
ImageId [int] )

INSERT INTO \#PrimaryKeys

SELECT MyPatientTable.PatientId, MyStudyTable.StudyId, MySeriesTable.SeriesId,
MyInstanceTable.ImageId

FROM MyInstanceTable

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesId =
MyInstanceTable.ImageSeriesId

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyId =
MySeriesTable.SeriesStudyId

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId

SET NOCOUNT OFF

SELECT \* FROM MyPatientTable WHERE PatientId IN ( SELECT PatientId FROM
\#PrimaryKeys )

SELECT \* FROM MyStudyTable WHERE StudyId IN ( SELECT StudyId FROM \#PrimaryKeys
)

SELECT \* FROM MySeriesTable WHERE SeriesId IN ( SELECT SeriesId FROM
\#PrimaryKeys )

SELECT \* FROM MyInstanceTable WHERE ImageId IN ( SELECT ImageId FROM
\#PrimaryKeys )

DROP TABLE \#PrimaryKeys

END

protected override void PrepareDeletePatientsCommand

DELETE

FROM MyPatientTable

WHERE ( MyPatientTable.PatientId IN

( SELECT MyPatientTable.PatientId

FROM MyInstanceTable

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesId =
MyInstanceTable.ImageSeriesId

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyId =
MySeriesTable.SeriesStudyId

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId )

)

protected override void PrepareDeleteStudiesCommand

DELETE

FROM MyStudyTable

WHERE ( MyStudyTable.StudyId IN

( SELECT MyStudyTable.StudyId

FROM MyInstanceTable

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesId =
MyInstanceTable.ImageSeriesId

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyId =
MySeriesTable.SeriesStudyId

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId )

)

protected override void PrepareDeleteSeriesCommand

DELETE

FROM MySeriesTable

WHERE ( MySeriesTable.SeriesId IN

( SELECT MySeriesTable.SeriesId

FROM MyInstanceTable

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesId =
MyInstanceTable.ImageSeriesId

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyId =
MySeriesTable.SeriesStudyId

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId )

)

protected override void PrepareDeleteInstanceCommand

DELETE

FROM MyInstanceTable

WHERE ( MyInstanceTable.SOPInstanceUID IN

( SELECT MyInstanceTable.SOPInstanceUID

FROM MyInstanceTable

LEFT OUTER JOIN MySeriesTable ON MySeriesTable.SeriesId =
MyInstanceTable.ImageSeriesId

LEFT OUTER JOIN MyStudyTable ON MyStudyTable.StudyId =
MySeriesTable.SeriesStudyId

LEFT OUTER JOIN MyPatientTable ON MyPatientTable.PatientId =
MyStudyTable.StudyPatientId )

)

protected override void PrepareDeletePatientsNoChildStudiesCommand

DELETE

FROM MyPatientTable

WHERE MyPatientTable.PatientId NOT IN ( SELECT MyStudyTable.StudyPatientId FROM
MyStudyTable )

**protected override void PrepareDeleteStudiesNoChildSeriesCommand**

DELETE

FROM MyStudyTable

WHERE MyStudyTable.StudyId NOT IN ( SELECT MySeriesTable.SeriesStudyId FROM
MySeriesTable )

protected override void PrepareDeleteSeriesNoChildInstancesCommand

DELETE

FROM MySeriesTable

WHERE MySeriesTable.SeriesId NOT IN ( SELECT MyInstanceTable.ImageSeriesId FROM
MyInstanceTable )

protected override void PrepareIsPatientExistsCommand

SELECT StudyStudyInstanceUID

FROM MyStudyTable

WHERE StudyStudyInstanceUID='2222'

protected override void PrepareIsStudyExistsCommand

SELECT StudyStudyInstanceUID

FROM MyStudyTable

WHERE StudyStudyInstanceUID='2222'

protected override void PrepareIsSeriesExistsCommand

SELECT SeriesSeriesInstanceUID

FROM MySeriesTable

WHERE SeriesSeriesInstanceUID='3333'

protected override void PrepareIsInstanceExistsCommand

SELECT SOPInstanceUID

FROM MyInstanceTable

WHERE SOPInstanceUID='4444'

了解更多

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

系列文章