private void EnsureLoadedCustomData(ArcenDynamicTableRow Row)
        {
            if (this.HaveLoadedData)
            {
                return;
            }
            this.HaveLoadedData = true;
            CustomDataSet set = Row.GetCustomData("defensePlacer");

            this.MinimumControllerDistance = (set.GetFInt("min_distance_percent_center_to_controller") * ExternalConstants.Instance.Balance_AverageGravWellRadius).IntValue;
            this.MaximumControllerDistance = (set.GetFInt("max_distance_percent_center_to_controller") * ExternalConstants.Instance.Balance_AverageGravWellRadius).IntValue;
            this.MinimumNumberOfNonControllerStrongAreas   = set.GetInt("min_number_of_non_controller_strong_areas");
            this.MaximumNumberOfNonControllerStrongAreas   = set.GetInt("max_number_of_non_controller_strong_areas");
            this.MinimumDistanceOfStrongAreaFromController = (set.GetFInt("min_distance_percent_controller_to_strong_area") * ExternalConstants.Instance.Balance_AverageGravWellRadius).IntValue;
            this.MaximumDistanceOfStrongAreaFromController = (set.GetFInt("max_distance_percent_controller_to_strong_area") * ExternalConstants.Instance.Balance_AverageGravWellRadius).IntValue;
        }
    //checks the PropertyForRent, Staff and Registration tables for the branchNo passed in
    public DataSet branchNumberConstraintExists(Dictionary<String, String> branchNumberConstraintExistsDict)
    {
        DataSet dsTemp = new DataSet(); // used to temporarily store the search results for the boolean check
        DataSet ds = new CustomDataSet();

        // Search for the existance of a foreign key across all tables where it may exist
        String sqlStatement = "SELECT branchNo " +
                                "FROM (SELECT branchNo FROM PropertyForRent " +
                                       "UNION " +
                                       "SELECT branchNo FROM Registration " +
                                       "UNION " +
                                       "SELECT branchNo FROM Staff " +
                                      ") AS result " +
                                "WHERE result.branchNo = @branchNo ";

        OleDbConnection conn = new OleDbConnection(Connections.DreamhomeConnStr());
        try
        {
            OleDbCommand cmd = new OleDbCommand(sqlStatement, conn);
            cmd.Parameters.AddWithValue("@branchNo", branchNumberConstraintExistsDict["branchNo"]);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);

            using (conn)
            {
                conn.Open();
                da.Fill(dsTemp);

                // if the row count result is > 0, return true into success table, else return false.
                Boolean results = dsTemp.Tables[0].Rows.Count > 0;
                ds.Tables[1].Rows.Add(results);
            }
        }
        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "branchNumberConstraintExists");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
    public DataSet branchExists(Dictionary<String, String> branchExistsDict)
    {
        DataSet ds = new CustomDataSet();

        // Run the lookupBranch method and, if the row count result is > 0,
        // return true into success table, else return false.
        try
        {
            Boolean results = lookupBranch(branchExistsDict["branchNo"]).Tables[0].Rows.Count > 0;
            ds.Tables[1].Rows.Add(results.ToString());
        }
        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "branchExists");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
    public DataSet updateStaff(Dictionary<String, String> updateStaffDict)
    {
        DataSet ds = new CustomDataSet();

        String sqlStatement = "UPDATE Staff SET staffNo = @staffNo, " +
                              "fName = @fName, " +
                              "lName = @lName, " +
                              "[position] = @position, " +
                              "sex = @sex, " +
                              "DOB = @DOB, " +
                              "salary = @salary, " +
                              "branchNo = @branchNo " +
                              "WHERE staffNo = @staffNo";

        OleDbConnection conn = new OleDbConnection();
        try
        {
            conn.ConnectionString = Connections.DreamhomeConnStr();
            OleDbCommand cmd = new OleDbCommand(sqlStatement, conn);

            cmd.Parameters.AddWithValue("@staffNo", checkForEmpty(updateStaffDict["staffNo"]));
            cmd.Parameters.AddWithValue("@fName", checkForEmpty(updateStaffDict["fName"]));
            cmd.Parameters.AddWithValue("@lName", checkForEmpty(updateStaffDict["lName"]));
            cmd.Parameters.AddWithValue("@position", checkForEmpty(updateStaffDict["position"]));
            cmd.Parameters.AddWithValue("@sex", checkForEmpty(updateStaffDict["sex"]));
            cmd.Parameters.AddWithValue("@DOB", checkForEmpty(updateStaffDict["DOB"]));
            cmd.Parameters.AddWithValue("@salary", checkForEmpty(updateStaffDict["salary"]));
            cmd.Parameters.AddWithValue("@branchNo", checkForEmpty(updateStaffDict["branchNo"]));

            //using block to dispose of the connection rather than a finally{ conn.Close(); }
            using (conn)
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "updateStaff");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
    public DataSet updateBranch(Dictionary<String, String> updateBranchDict)
    {
        DataSet ds = new CustomDataSet();

        String sqlStatement = "UPDATE Branch SET branchNo = @branchNo, " +
                              "street = @street, " +
                              "city = @city, " +
                              "postcode = @postcode " +
                              "WHERE branchNo = @branchNo ";

        OleDbConnection conn = new OleDbConnection();
        try
        {
            conn.ConnectionString = Connections.DreamhomeConnStr();
            OleDbCommand cmd = new OleDbCommand(sqlStatement, conn);
            cmd.Parameters.AddWithValue("@branchNo", checkForEmpty(updateBranchDict["branchNo"]));
            cmd.Parameters.AddWithValue("@street", checkForEmpty(updateBranchDict["street"]));
            cmd.Parameters.AddWithValue("@city", checkForEmpty(updateBranchDict["city"]));
            cmd.Parameters.AddWithValue("@postcode", checkForEmpty(updateBranchDict["postcode"]));

            using (conn)
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "updateBranch");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
    public DataSet insertStaff(Dictionary<String, String> insertStaffDict)
    {
        DataSet ds = new CustomDataSet();

        String sqlStatement = "INSERT INTO Staff(staffNo, fName, lName, [position], sex, DOB, salary, branchNo) " +
                               "VALUES (@staffNo, @fName, @lName, @position, @sex, @DOB, @salary, @branchNo); ";

        OleDbConnection conn = new OleDbConnection();
        try
        {
            conn.ConnectionString = Connections.DreamhomeConnStr();
            OleDbCommand cmd = new OleDbCommand(sqlStatement, conn);
            cmd.Parameters.AddWithValue("@staffNo", checkForEmpty(insertStaffDict["staffNo"]));
            cmd.Parameters.AddWithValue("@fName", checkForEmpty(insertStaffDict["fName"]));
            cmd.Parameters.AddWithValue("@lName", checkForEmpty(insertStaffDict["lName"]));
            cmd.Parameters.AddWithValue("@position", checkForEmpty(insertStaffDict["position"]));
            cmd.Parameters.AddWithValue("@sex", checkForEmpty(insertStaffDict["sex"]));
            cmd.Parameters.AddWithValue("@DOB", checkForEmpty(insertStaffDict["DOB"]));
            cmd.Parameters.AddWithValue("@salary", checkForEmpty(insertStaffDict["salary"]));
            cmd.Parameters.AddWithValue("@branchNo", checkForEmpty(insertStaffDict["branchNo"]));

            using (conn)
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "insertStaff");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
    public DataSet managerExists(Dictionary<String, String> managerExistsDict)
    {
        DataSet dsTemp = new DataSet(); // used to temporarily store the search results for the boolean check
        DataSet ds = new CustomDataSet();

        String sqlStatement = "SELECT *FROM Staff WHERE branchNo = @branchNo AND [position] = @position ";

        OleDbConnection conn = new OleDbConnection(Connections.DreamhomeConnStr());
        try
        {
            OleDbCommand cmd = new OleDbCommand(sqlStatement, conn);
            cmd.Parameters.AddWithValue("@branchNo", managerExistsDict["branchNo"]);
            cmd.Parameters.AddWithValue("@position", "Manager");
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);

            using (conn)
            {
                conn.Open();
                da.Fill(dsTemp);

                // if the row count result is > 0, return true into success table, else return false.
                Boolean results = dsTemp.Tables[0].Rows.Count > 0;
                ds.Tables[1].Rows.Add(results);
            }
        }
        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "managerExists");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
    public DataSet deleteStaff(Dictionary<String, String> deleteStaffDict)
    {
        DataSet ds = new CustomDataSet();

        String sqlStatement = "DELETE FROM Staff WHERE staffNo=@staffNo";
        OleDbConnection conn = new OleDbConnection(Connections.DreamhomeConnStr());
        OleDbCommand cmd = new OleDbCommand(sqlStatement, conn);
        try
        {
            cmd.Parameters.AddWithValue("@staffNo", deleteStaffDict["staffNo"]);

            using (conn)
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

        // catch error and enter into logError then pass a generic error
        // back to the user through the custom return table
        catch (Exception ex)
        {
            BusinessTier.logError(ex, "DataTier", "deleteStaff");
            ds.Tables[0].Rows.Add("An unexpected error occurred. Please try again later or contact support.");
        }

        return ds;
    }
        public void LoadCustomData(ArcenDynamicTableRow Row)
        {
            CustomDataSet set = Row.GetCustomData("TargetSorter");

            this.IsGroupSorter = set.GetBool("is_group_sorter");
        }
        /// <summary>
        /// Performs multiple updates in a single transaction, with disparate (but presumably related) data.
        /// </summary>
        /// <param name="dataSet1">first data set</param>
        /// <param name="dataSet2">second data set</param>
        public void UpdateMultipleDetails(CustomDataSet dataSet1, SpecialDataSet dataSet2)
        {
            // Prepare the connection
            IDbConnection connection = new System.Data.SqlClient.SqlConnection( /* Connection string goes here*/ );
            Library.TransactionWrapper transactionWrapper = new Library.TransactionWrapper(connection);

            // Hook data for first operation
            CustomDataUpdate customDataUpdate = new CustomDataUpdate(this.log);
            CustomTransactionedOperation operation1 = new CustomTransactionedOperation(dataSet1);
            operation1.Execute += new Library.TransactionedOperationDelegate(customDataUpdate.UpdateData);

            // Hook data for second operation
            AggregateTransactionedOperation operation2 = new AggregateTransactionedOperation(dataSet2);
            operation2.Execute += new Library.TransactionedOperationDelegate(AggregateTransactionedOperation.SelfContainedUpdateData);

            // Collect together the operations and make them atomic
            Library.TransactionedOperation[] operations = new Library.TransactionedOperation[] {operation1, operation2};
            transactionWrapper.MakeAtomic(operations);
        }
        private ILog log = null; // Initialise this somewhere...

        #endregion Fields

        #region Methods

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dataSet"></param>
        public void UpdateCustomDetails(CustomDataSet dataSet)
        {
            IDbConnection connection = new System.Data.SqlClient.SqlConnection( /* Connection string goes here*/ );
            Library.TransactionWrapper transactionWrapper = new Library.TransactionWrapper(connection);

            // Hook the data onto the operation parameters
            CustomDataUpdate customDataUpdate = new CustomDataUpdate(this.log);
            CustomTransactionedOperation operation = new CustomTransactionedOperation(dataSet);
            operation.Execute += new Library.TransactionedOperationDelegate(customDataUpdate.UpdateData);

            transactionWrapper.MakeAtomic(operation);
        }
 public CustomTransactionedOperation(CustomDataSet dataSet)
 {
     this.Example = dataSet.ExampleData;
 }