Provides members for managing orphaned database records.
public interface IStorageDataAccessAgent7 : IStorageDataAccessAgent6, IStorageDataAccessAgent5, IStorageDataAccessAgent4, IStorageDataAccessAgent3, IStorageDataAccessAgent2, IStorageDataAccessAgent public:interface class IStorageDataAccessAgent7 abstract : IStorageDataAccessAgent6, IStorageDataAccessAgent5,IStorageDataAccessAgent4, IStorageDataAccessAgent3, IStorageDataAccessAgent2,IStorageDataAccessAgent
The IStorageDataAccessAgent7 interface derives from these interfaces:
The functionality in the IStorageDataAccessAgent7 interface that is not a part of the derived interfaces is related to managing orphaned database records.
A production PACS Storage Server database frequent database activity (inserts, updates, deletes, queries). The inserts and deletes can result in orphaned records.
An orphaned record is a record whose foreign key value references a non-existent primary key value.
In the Medical Storage Server database, the Patient, Study, Series, and Instance tables are linked by foreign keys. This allows the tables to exhibit a one-to-many relationship:
As a simple example, one patient may have five instances:
Deleting the 5 instance records would result in the Patient, Study, and Series records being orphaned. The Patient, Study, and Series records still exist in the database, but there is no corresponding instance.
This example shows how to use IStorageDataAccessAgent7 members to remove orphaned database records in several different ways.
using Leadtools.Dicom;using Leadtools.DicomDemos;using Leadtools.Medical.DataAccessLayer;using Leadtools.Medical.DataAccessLayer.Catalog;using Leadtools.Medical.Storage.DataAccessLayer;using Leadtools.Medical.Storage.DataAccessLayer.Configuration;public static IStorageDataAccessAgent7 GetStorageDataAccessAgent7(){// Before running this sample, follow these steps:// 1. Run CSPacsDatabaseConfigurationDemo.exe to create the databases// 2. Run CSPACSConfigDemo.exe to create the DICOM services// 3. Set 'serviceDirectory' to the DICOM service folderstring serviceDirectory = @"d:\LEADTOOLS22\Bin\Dotnet4\x64\L22_PACS_SCP64";string productName = "StorageServer";string serviceName = "L22_PACS_SCP64";System.Configuration.Configuration configuration = DicomDemoSettingsManager.GetGlobalPacsAddinsConfiguration(serviceDirectory);StorageDataAccessConfigurationView view = new StorageDataAccessConfigurationView(configuration, productName, serviceName);IStorageDataAccessAgent7 agent = DataAccessFactory.GetInstance(view).CreateDataAccessAgent<IStorageDataAccessAgent7>();return agent;}public static void InsertDicomFile(IStorageDataAccessAgent7 agent, string filename){using (DicomDataSet ds = new DicomDataSet()){ds.Load(filename, DicomDataSetLoadFlags.None);agent.StoreDicom(ds, filename, string.Empty, null, true, true, true, true);}}public static void RemoveInstance(IStorageDataAccessAgent7 agent, string sopInstanceUid, bool removeOrphanedRecords){ICatalogEntity instanceEntity = RegisteredEntities.GetInstanceEntity(sopInstanceUid);MatchingParameterCollection mpc = new MatchingParameterCollection();MatchingParameterList mpl = new MatchingParameterList();mpl.Add(instanceEntity);mpc.Add(mpl);agent.DeleteInstance(mpc, removeOrphanedRecords);}public static void AddDicomImages(IStorageDataAccessAgent7 agent){// Clear the databaseagent.EmptyTable(Table.Patient);agent.EmptyTable(Table.Study);agent.EmptyTable(Table.Series);agent.EmptyTable(Table.Instance);// Add four DICOM Images, all the same Patient, Study, and SeriesInsertDicomFile(agent, @"D:\LEADTOOLS22\Resources\Images\DICOM\MG\mg1.dcm");InsertDicomFile(agent, @"D:\LEADTOOLS22\Resources\Images\DICOM\MG\mg2.dcm");InsertDicomFile(agent, @"D:\LEADTOOLS22\Resources\Images\DICOM\MG\mg3.dcm");InsertDicomFile(agent, @"D:\LEADTOOLS22\Resources\Images\DICOM\MG\mg4.dcm");// Add another image that will not have orphansInsertDicomFile(agent, @"D:\LEADTOOLS22\Resources\Images\DICOM\image2.dcm");}public static void CreatePatientStudySeriesOrphan(IStorageDataAccessAgent7 agent){AddDicomImages(agent);MatchingParameterCollection mc = new MatchingParameterCollection();DataSet ds = agent.QueryPatients(mc);// Remove the four SOPInstanceUID without removing orphansbool removeOrphanedRecords = false;RemoveInstance(agent, "1.2.840.114257.1.9.1245.56421.20124.5464751.12465.120.3", removeOrphanedRecords);RemoveInstance(agent, "1.2.840.114257.1.9.1245.56421.52314.14567.124.2124", removeOrphanedRecords);RemoveInstance(agent, "1.2.840.114257.1.9.1245.56421.52314.5647.124.2124.1", removeOrphanedRecords);RemoveInstance(agent, "1.2.840.114257.1.9.1245.56421.7124.1245.1245.9542.1245", removeOrphanedRecords);}public static void StorageDatAccessOrphanExample(){try{DicomEngine.Startup();IStorageDataAccessAgent7 agent = GetStorageDataAccessAgent7();// This creates orphans:// 1 Patient orphan// 1 Study orphan// 1 Series orphan// 1 Instance orphanCreatePatientStudySeriesOrphan(agent);// Test 1// Remove all orphans in the databaseagent.RemoveOrphanRecords(null, OrphanTables.All);// Create the 3 orphans againCreatePatientStudySeriesOrphan(agent);// Test 2// This time remove only orphan records for a particular patientMatchingParameterCollection mc = new MatchingParameterCollection();MatchingParameterList mpl = new MatchingParameterList();string patientId = "656421";ICatalogEntity patientEntity = RegisteredEntities.GetPatientEntity(patientId);mpl.Add(patientEntity);mc.Add(mpl);try{// Set diagnostic level to 1 to see debug messages in an application like DebugViewagent.DiagnosticLevel = 1;agent.RemoveOrphanRecords(mc, OrphanTables.Series);agent.RemoveOrphanRecords(mc, OrphanTables.Study);agent.RemoveOrphanRecords(mc, OrphanTables.Patient);}finally{// Set diagnostic level back to 0 to stop showing debug messagesagent.DiagnosticLevel = 0;}// Test 3// Add DICOM images, and then delete instances, studies, patients while removing orphansAddDicomImages(agent);agent.DeleteInstance(null, true);// Test 4// Add DICOM images, delete series removing all orphans.AddDicomImages(agent);agent.DeleteSeries(null, true);// Test 5// Add DICOM images. delete study removing all orphans.AddDicomImages(agent);agent.DeleteStudy(null, true);}finally{DicomEngine.Shutdown();}Console.WriteLine("Finished");}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
