/// <summary>
        /// Deletes External Macro Source
        /// </summary>
        /// <param name="externalMacroSource">The External Macro Source</param>
        public void DeleteExternalMacroSource(IExternalMacroSource externalMacroSource)
        {
            try
            {
                if (externalMacroSource == null)
                {
                    throw new ArgumentNullException("externalMacroSource");
                }

                string sql =
                    $" DELETE FROM {SQLServerDataContract.ExternalMacroSource.TABLE_NAME} " +
                    $" WHERE " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_ID_NAME} = @id; ";
                using (var connection = CreateConnection())
                {
                    connection.Open();
                    using (var command = CreateCommand(connection, CommandType.Text, sql))
                    {
                        command.Parameters.Add(CreateParameter(DbType.Int64, "@id", externalMacroSource.ID));

                        int recordsAffected = command.ExecuteNonQuery();
                        logger.Info($"Deleted MacroSource - {recordsAffected} records affected");
                    }
                }
            }
            catch (Exception caught)
            {
                logger.Error("Unexpected Error Deleting External Macro Source", caught);
                throw;
            }
        }
        /// <summary>
        /// Update Macro Source
        /// </summary>
        /// <param name="externalMacroSource">The External Macro Source</param>
        public void UpdateExternalMacroSource(IExternalMacroSource externalMacroSource)
        {
            try
            {
                if (externalMacroSource == null)
                {
                    throw new ArgumentNullException("externalMacroSource");
                }

                string sql =
                    $" UPDATE {SQLServerDataContract.ExternalMacroSource.TABLE_NAME} SET " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_MACRO_ID_NAME} = @macroID, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_CREATE_DATE_NAME} = @createDate, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_QUALIFIED_NAME_NAME} = @qualifiedName, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_EXTERNAL_SOURCE_CODE_NAME} = @externalSourceCode, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_ACCELERATOR_NAME} = @accelerator, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_INTERVAL_NAME} = @interval, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_MODE_NAME} = @mode, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_PLAY_SECONDS_NAME} = @playSeconds, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_REPEAT_TIMES_NAME} = @repeatTimes, " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_MACRO_SOURCE_NAME} = @macroSource " +
                    $" WHERE " +
                    $"      {SQLServerDataContract.ExternalMacroSource.COLUMN_ID_NAME} = @id; ";
                using (var connection = CreateConnection())
                {
                    connection.Open();
                    using (var command = CreateCommand(connection, CommandType.Text, sql))
                    {
                        command.Parameters.Add(CreateParameter(DbType.Int64, "@id", externalMacroSource.ID));
                        command.Parameters.Add(CreateParameter(DbType.Int64, "@macroID", externalMacroSource.MacroID));
                        command.Parameters.Add(CreateParameter(DbType.DateTime, "@createDate", externalMacroSource.CreateDate));
                        command.Parameters.Add(CreateParameter(DbType.String, "@qualifiedName", externalMacroSource.QualifiedName));
                        command.Parameters.Add(CreateParameter(DbType.String, "@externalSourceCode", externalMacroSource.ExternalSourceCode));
                        command.Parameters.Add(CreateParameter(DbType.String, "@accelerator", externalMacroSource.Accelerator));
                        command.Parameters.Add(CreateParameter(DbType.String, "@interval", externalMacroSource.Interval));
                        command.Parameters.Add(CreateParameter(DbType.String, "@mode", externalMacroSource.Mode));
                        command.Parameters.Add(CreateParameter(DbType.String, "@playSeconds", externalMacroSource.PlaySeconds));
                        command.Parameters.Add(CreateParameter(DbType.String, "@repeatTimes", externalMacroSource.RepeatTimes));
                        command.Parameters.Add(CreateParameter(DbType.String, "@macroSource", externalMacroSource.MacroSource));

                        int recordsAffected = command.ExecuteNonQuery();
                        logger.Info($"Updated MacroSource - {recordsAffected} records affected");
                    }
                }
            }
            catch (Exception caught)
            {
                logger.Error("Unexpected Error Updating Macro Soruce", caught);
                throw;
            }
        }