/// <summary>
        /// Returns the Bytes stored in a binary column.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="columnName">The column name.</param>
        /// <returns>Bytes Stored in a column.</returns>
        public static byte[] GetBytes(SafeDataReader reader, string columnName)
        {
            var buffer = new byte[1024];
            long fieldOffset = 0;
            
            using (var stream = new MemoryStream())
            {
                long bytesRead;

                while ((bytesRead = reader.GetBytes(columnName, fieldOffset, buffer, 0, buffer.Length)) > 0)
                {
                    var actualRead = new byte[bytesRead];
                    Buffer.BlockCopy(buffer, 0, actualRead, 0, (int)bytesRead);
                    stream.Write(actualRead, 0, actualRead.Length);
                    fieldOffset += bytesRead;
                }

                return stream.ToArray();
            }
        }
        /// <summary>
        /// The copy icons.
        /// </summary>
        public override Dictionary<string, byte[]> CopyIcons()
        {
            var values = new List<string>();
            var items = new Dictionary<string, byte[]>();
            const string commandText = @"
SELECT [Id]
      ,[Name]
      ,[Description]
      ,[Icon]
      ,[fa_alternative]
  FROM [dbo].[Icons]
";
            using (var ctx = GetMetaDatabaseConnectionManager())
            {
                using (var cmd = new SqlCommand(commandText, ctx.Connection))
                {
                    using (var reader = new SafeDataReader(cmd.ExecuteReader()))
                    {
                        while (reader.Read())
                        {
                            var filenameOrigin = reader.GetString(1);
                            var data = reader.GetBytes(3);

                            var filename = string.Format("{0}.png", filenameOrigin.Trim());

                            if (!items.ContainsKey(filename) && filename != ".png")
                            {
                                items.Add(filename, (byte[])data);
                            }

                            values.Add(string.Format("({0},'{1}','{2}', NULL,'{3}')", reader.GetInt32(0), filenameOrigin.Trim(), reader.GetString(2), reader.GetString(4)));
                        }
                    }
                }
            }

            var script = string.Format(@"   SET IDENTITY_INSERT __Icon ON
MERGE INTO [dbo].[__Icon] AS TARGET USING (
    VALUES {0}
                                                     ) 
        AS Source([Id], [Name], [Description], [Icon], [fa_alternative]) ON TARGET.id = Source.Id -- update matched rows
 WHEN MATCHED THEN
UPDATE
SET [Name] = Source.[Name],
    [Description] = Source.[Description],
    [Icon] = NULL,
    [fa_alternative] = Source.[fa_alternative],
    [IsRemoved] = 0  -- insert new rows
 WHEN NOT MATCHED BY TARGET THEN
INSERT ([Id],
        [Name],
        [Description],
        [Icon],
        [fa_alternative],
        [IsRemoved])
VALUES ([Id],
        [Name],
        [Description],
        NULL,
        [fa_alternative],
        0)

 -- delete rows that are in the target but not the source
WHEN NOT MATCHED BY SOURCE THEN
DELETE ;

SET IDENTITY_INSERT __Icon OFF
", string.Join(",", values));

            ExecuteSql(script);
            return items;
        }