public void GetCachedSnapshot()
        {
            #region arrange
            var db = new DatabaseService();
            #endregion

            #region act GetCachedSnapshot
            var snapshot = db.GetCachedSnapshot();
            #endregion

            #region assert
            Assert.AreNotEqual(0, snapshot.Servers.Count);

            Assert.AreNotEqual(0, snapshot.Servers[0].Databases.Count);

            Assert.AreNotEqual(0, snapshot.Servers[0].Databases[0].Tables.Count);

            var allTables = snapshot.Servers.SelectMany(c => c.Databases).SelectMany(c => c.Tables).ToArray();
            Assert.AreNotEqual(0, allTables.Count());
            Assert.AreEqual(0, allTables.Where(c => c.Columns.Count == 0).Count());

            Assert.AreNotEqual(0, snapshot.Servers[0].Databases[0].Views.Count);
            Assert.AreNotEqual(0, snapshot.Servers[0].Databases[0].Views[0].Columns.Count);
            if (string.IsNullOrEmpty(snapshot.Servers[0].Databases[0].Views[0].Text)) Assert.Fail("didn't return code");

            Assert.AreNotEqual(0, snapshot.Servers[0].Databases[0].StoredProcedures.Count);
            Assert.AreNotEqual(0, snapshot.Servers[0].Databases[0].StoredProcedures[0].Columns.Count);

            var allStoredProcedures = snapshot.Servers.SelectMany(c => c.Databases).SelectMany(c => c.StoredProcedures).ToArray();
            Assert.AreNotEqual(0, allStoredProcedures.Count());
            Assert.AreEqual(0, allStoredProcedures.Where(c => string.IsNullOrEmpty(c.Text)).Count());
            #endregion

            #region act GetChangesSince and LastUpdatedObject
            var differential = snapshot.GetChangesSince(DateTime.Now.AddDays(-1));
            var lastUpdated = snapshot.LastUpdatedObject;
            #endregion

            #region act FillSnapshotWithLatestChanges
            db.FillSnapshotWithLatestChanges(snapshot, snapshot.LastUpdatedObject.Value.AddDays(-3));
            #endregion

            #region GetCachedSnapshot that triggers FillSnapshotWithLatestChanges
            ApplicationKeeper.Remove("LastTimeCheckedForUpdates");
            db.GetCachedSnapshot();
            #endregion

            /// save it to file to check size and format
            new XmlSerializer(typeof(Snapshot)).Serialize(new FileStream("snapshot.txt", FileMode.Create), snapshot);
        }
        public System.Data.DataSet ExecuteStoredProcedure(DAL.StoredProcedure StoredProcedure, out string error)
        {
            error = string.Empty;
            DataSet result = new DataSet();

            var snapshot = new DatabaseService().GetCachedSnapshot();

            var database =  snapshot.Servers.SelectMany(c => c.Databases).SingleOrDefault(c => c.DatabaseServerId == StoredProcedure.DatabaseServerId);
            var server = snapshot.Servers.SingleOrDefault(c => c.Id == database.ServerId);

            using(var con = new SqlConnection(server.GetTreatedConnectionString()))
            using (var com = con.CreateCommand())
            {
                com.CommandText = string.Format("[{0}].{1}", database.Name, StoredProcedure.SchemaAndName);
                com.CommandType = System.Data.CommandType.StoredProcedure;
                com.CommandTimeout = 20;

                foreach (var column in StoredProcedure.Columns)
                    com.Parameters.Add(new SqlParameter(column.Name, column.GetSampleValue(false)));

                using (var adapter = new SqlDataAdapter(com))
                {
                    con.Open();
                    try
                    {
                        adapter.Fill(result);
                    }
                    catch (Exception ex)
                    {
                        error = ex.ToString();
                    }
                    finally
                    {
                        con.Close();
                    }

                }
            }

            return result;
        }