private void executeDQDataset(String DQDatasetGUID) throws Exception {
		ArrayList<DQTestResultRecord> dqTestResults = new ArrayList<DQTestResultRecord>();
		
		DQDatasetDefinitionManager dataSetDefinitionManager = new DQDatasetDefinitionManager(DQDatasetGUID);
		
		//Set the mandatory parameters
		//FIXME this needs to be read from an external configuration!
		ParameterManager dspm = dataSetDefinitionManager.ParameterManager;
		dspm.addParameter("JDBC_DRIVER_TYPE", "sqlserver");		
		dspm.addParameter("DQ_REPOSITORY_SERVER_NAME", "ZAMDH20110\\SQL2008");
		dspm.addParameter("DQ_REPOSITORY_DATABASE_NAME", "Vodacom_DQ");
		dspm.addParameter("DQ_REPOSITORY_DATABASE_USER", "Vodacom_DQ");
		dspm.addParameter("DQ_REPOSITORY_DATABASE_PASSWORD", "g1mm3DASHBOARDS!");
		dspm.addParameter("DQ_REPOSITORY_DATABASE_SCHEMA", "DQ_DASHBOARD");
  
		printConsoleMessage("Fetching definition...");
		try {
			DQDatasetDefinition datasetDef = dataSetDefinitionManager.FetchDQMDatasetDefinition();
			printConsoleMessage("Got it!");
		
			//Depending on the data source type, we will need to instantiate different types of dataset fillers.
			/* TODO Handle this dynamically.  At the moment this method is fragile, because any additional DQMDatasetSourceTypes will
				result in a re-compilation of this class. */
			switch (datasetDef.getDatasetSourceType()) {
			case TERADATA_SQL:
				TeradataSQLDatasetFiller filler = new TeradataSQLDatasetFiller();
				
				//Set the mandatory parameters
				//FIXME this needs to be read from an external configuration!
				filler.ParameterManager.addParameter("DB_SERVER_NAME", "CWHPROD");
				filler.ParameterManager.addParameter("DB_USER_NAME", "GADDINRO");
				filler.ParameterManager.addParameter("DB_PASSWORD", "1s33SUMMER!");
				
				printConsoleMessage("Extracting the results from Teradata...");
				try {
					dqTestResults = filler.ExtractDQTestResults(datasetDef);
					printConsoleMessage("Hurrah!  I got " + dqTestResults.size() + " records!");
				} catch (Exception e)
				{
					printConsoleMessage("Eeps - it failed!  " + e.getMessage());
				}
				
				break;
			default:
				break;
			}

		} catch (Exception e) {
			printConsoleMessage("Boo hoo - it didn't work out!  " + e.getMessage());
		}
		
		//Now, we need to pass the DQ result set to an appropriate implementation of IDQResultsProcessor
		//TODO: A mapping must be created between the DQDataset and the list of processors that should operate on it.  For now, 
		//we are just going to implement a single processor which persists the test results to a SQL Server database.
		if(dqTestResults.size() > 0) {
			SQLServerDatabasePersistanceProcessor proc = new SQLServerDatabasePersistanceProcessor();
			
			//Set the mandatory parameters
			//FIXME this needs to be read from an external configuration!
			proc.addParameter("Server_Name", "ZAMDH20110\\SQL2008");
			proc.addParameter("Initial_Catalog", "Vodacom_DQ");
			proc.addParameter("User_Name", "Vodacom_DQ");
			proc.addParameter("Password", "g1mm3DASHBOARDS!");
			proc.addParameter("Target_Table", "DQ_Test_Result_History_Detail");
			proc.addParameter("Target_Schema", "DQ_DASHBOARD");
			proc.addParameter("JDBC_Batch_Size", "50000");
			
			printConsoleMessage("Processing results...");
			try {
				proc.ProcessResultSet(dqTestResults);
				printConsoleMessage("Success!");
			} catch (SQLException e) {
				printConsoleMessage("Aw shoot - something broke!  " + e.getMessage() + "  Keeping calm and carrying on...");
			}
			
			//Finally, we need to tell the Dataset Manager to update the high-water mark.
			dataSetDefinitionManager.UpdateHighwaterMark(proc.GetHighWaterMark());
		}
	}