protected internal void RebuildSpatialIndex(IDbConnection conn, SqlServer2008SpatialIndexGridDensity level1,
                                                    SqlServer2008SpatialIndexGridDensity level2,
                                                    SqlServer2008SpatialIndexGridDensity level3,
                                                    SqlServer2008SpatialIndexGridDensity level4)
        {
            Func <SqlServer2008SpatialIndexGridDensity, string> dlgtName =
                delegate(SqlServer2008SpatialIndexGridDensity o)
            {
                switch (o)
                {
                case SqlServer2008SpatialIndexGridDensity.Low:
                    return("LOW");

                case SqlServer2008SpatialIndexGridDensity.Medium:
                    return("MEDIUM");

                default:
                    return("HIGH");
                }
            };

            IExtents2D ext = GetExtents() as IExtents2D;

            StringBuilder sb = new StringBuilder();

            string ndxName = string.Format("[sidx_{0}_{1}]", Table, GeometryColumn);

            sb.AppendFormat(
                @"IF EXISTS(SELECT * FROM sys.indexes where name='{0}' and object_id = object_id('{1}'))
BEGIN
DROP INDEX {0} ON {1}
END
",
                ndxName, QualifiedTableName);

            sb.AppendFormat(CultureInfo.InvariantCulture,
                            @"CREATE SPATIAL INDEX {0}
   ON {2}({1})
   USING GEOMETRY_GRID
   WITH (
    BOUNDING_BOX = ( xmin={3}, ymin={4}, xmax={5}, ymax={6} ),
    GRIDS = ({7}, {8}, {9}, {10}));
",
                            ndxName, GeometryColumn, QualifiedTableName, ext.Min[Ordinates.X], ext.Min[Ordinates.Y],
                            ext.Max[Ordinates.X], ext.Max[Ordinates.Y], dlgtName(level1), dlgtName(level2),
                            dlgtName(level3),
                            dlgtName(level4));

            using (IDbCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = sb.ToString();
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
            }
        }
 public void RebuildSpatialIndex(SqlServer2008SpatialIndexGridDensity level1,
                                 SqlServer2008SpatialIndexGridDensity level2,
                                 SqlServer2008SpatialIndexGridDensity level3,
                                 SqlServer2008SpatialIndexGridDensity level4)
 {
     using (IDbConnection conn = DbUtility.CreateConnection(ConnectionString))
     {
         conn.Open();
         RebuildSpatialIndex(conn, level1, level2, level3, level4);
     }
 }