Example #1
0
        /// <summary>
        /// Creates a new table in a Microsoft SQL Server database and copies rows from an existing datasource.
        /// </summary>
        /// <remarks>
        /// <para>The datatable created will contain six extra columns besides the attribute data: "OID" (Object ID row),
        /// "WKB_Geometry" (Geometry stored as WKB), and Envelope_MinX, Envelope_MinY, Envelope_MaxX, Envelope_MaxY
        /// for geometry bounding box.</para>
        /// <para>
        /// <example>
        /// Upload a ShapeFile to a database:
        /// <code>
        /// public void CreateDatabase(string shapeFile)
        /// {
        ///		if (!System.IO.File.Exists(shapeFile))
        ///		{
        ///			MessageBox.Show("File not found");
        ///			return;
        ///		}
        ///		ShapeFile shp = new ShapeFile(shapeFile, false);
        ///		//Create tablename from filename
        ///		string tablename = shapeFile.Substring(shapeFile.LastIndexOf('\\') + 1,
        ///			shapeFile.LastIndexOf('.') - shapeFile.LastIndexOf('\\') - 1);
        ///		//Create connectionstring
        ///		string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|GeoDatabase.mdf;Integrated Security=True;User Instance=True";
        ///		int count = SharpMap.Data.Providers.MsSql.CreateDataTable(shp, tablename, connstr);
        ///		MessageBox.Show("Uploaded " + count.ToString() + " features to datatable '" + tablename + "'");
        ///	}
        /// </code>
        /// </example>
        /// </para>
        /// </remarks>
        /// <param name="datasource">Datasource to upload</param>
        /// <param name="tablename">Name of table to create (existing table will be overwritten!)</param>
        /// <param name="connstr">Connection string to database</param>
        /// <returns>Number or rows inserted, -1 if failed and 0 if table created but no rows inserted.</returns>
        public static int CreateDataTable(SharpMap.Data.Providers.IFeatureProvider datasource, string tablename, string connstr)
        {
            if (datasource is IFileBased)
            {
                IFileBased fileBasedDataSource = (IFileBased)datasource;
                fileBasedDataSource.Open(fileBasedDataSource.Path);
            }

            // TODO: this should work as IFeature
            FeatureDataRow       geom    = (FeatureDataRow)datasource.GetFeature(0);
            DataColumnCollection columns = geom.Table.Columns;
            int counter = -1;

            using (SqlConnection conn = new SqlConnection(connstr))
            {
                SqlCommand command = new SqlCommand();
                command.Connection = conn;

                conn.Open();
                //Try to drop table if it exists
                try
                {
                    command.CommandText = "DROP TABLE \"" + tablename + "\";";
                    command.ExecuteNonQuery();
                }
                catch { }
                //Create new table for storing the datasource
                string sql = "CREATE TABLE " + tablename + " (oid INTEGER IDENTITY PRIMARY KEY, WKB_Geometry Image, " +
                             "Envelope_MinX real, Envelope_MinY real, Envelope_MaxX real, Envelope_MaxY real";
                foreach (DataColumn col in columns)
                {
                    if (col.DataType != typeof(String))
                    {
                        sql += ", " + col.ColumnName + " " + Type2SqlType(col.DataType).ToString();
                    }
                    else
                    {
                        sql += ", " + col.ColumnName + " VARCHAR(256)";
                    }
                }
                command.CommandText = sql + ");";
                command.ExecuteNonQuery();
                counter++;

                ICollection <int> indexes = datasource.GetObjectIDsInView(datasource.GetExtents());

                //Select all indexes in shapefile, loop through each feature and insert them one-by-one
                foreach (int idx in indexes)
                {
                    //Get feature from shapefile
                    // TODO: this should work as IFeature
                    SharpMap.Data.FeatureDataRow feature = (FeatureDataRow)datasource.GetFeature(idx);
                    if (counter == 0)
                    {
                        //Create insert script
                        string strSQL = " (";
                        foreach (DataColumn col in feature.Table.Columns)
                        {
                            strSQL += "@" + col.ColumnName + ",";
                        }

                        strSQL += "@WKB_Geometry,@Envelope_MinX,@Envelope_MinY, " +
                                  "@Envelope_MaxX,@Envelope_MaxY)";
                        strSQL = "INSERT INTO " + tablename + strSQL.Replace("@", "") + " VALUES" + strSQL;

                        command.CommandText = strSQL;
                        command.Parameters.Clear();
                        //Add datacolumn parameters
                        foreach (DataColumn col in feature.Table.Columns)
                        {
                            command.Parameters.Add("@" + col.ColumnName, Type2SqlType(col.DataType));
                        }

                        //Add geometry parameters
                        command.Parameters.Add("@WKB_Geometry", SqlDbType.VarBinary);
                        command.Parameters.Add("@Envelope_MinX", SqlDbType.Real);
                        command.Parameters.Add("@Envelope_MinY", SqlDbType.Real);
                        command.Parameters.Add("@Envelope_MaxX", SqlDbType.Real);
                        command.Parameters.Add("@Envelope_MaxY", SqlDbType.Real);
                    }
                    //Set values
                    foreach (DataColumn col in feature.Table.Columns)
                    {
                        command.Parameters["@" + col.ColumnName].Value = feature[col];
                    }
                    if (feature.Geometry != null)
                    {
                        command.Parameters["@WKB_Geometry"].Value = feature.Geometry.AsBinary();                         //Add the geometry as Well-Known Binary
                        GeoAPI.Geometries.IEnvelope box = feature.Geometry.EnvelopeInternal;
                        command.Parameters["@Envelope_MinX"].Value = box.MinX;
                        command.Parameters["@Envelope_MinY"].Value = box.MinY;
                        command.Parameters["@Envelope_MaxX"].Value = box.MaxX;
                        command.Parameters["@Envelope_MaxY"].Value = box.MaxY;
                    }
                    else
                    {
                        command.Parameters["@WKB_Geometry"].Value  = DBNull.Value;
                        command.Parameters["@Envelope_MinX"].Value = DBNull.Value;
                        command.Parameters["@Envelope_MinY"].Value = DBNull.Value;
                        command.Parameters["@Envelope_MaxX"].Value = DBNull.Value;
                        command.Parameters["@Envelope_MaxY"].Value = DBNull.Value;
                    }
                    //Insert row
                    command.ExecuteNonQuery();
                    counter++;
                }
                //Create indexes
                command.Parameters.Clear();
                command.CommandText = "CREATE INDEX [IDX_Envelope_MinX] ON " + tablename + " (Envelope_MinX)";
                command.ExecuteNonQuery();
                command.CommandText = "CREATE INDEX [IDX_Envelope_MinY] ON " + tablename + " (Envelope_MinY)";
                command.ExecuteNonQuery();
                command.CommandText = "CREATE INDEX [IDX_Envelope_MaxX] ON " + tablename + " (Envelope_MaxX)";
                command.ExecuteNonQuery();
                command.CommandText = "CREATE INDEX [IDX_Envelope_MaxY] ON " + tablename + " (Envelope_MaxY)";
                command.ExecuteNonQuery();

                conn.Close();
            }
            if (datasource is IFileBased)
            {
                ((IFileBased)datasource).Close();
            }

            return(counter);
        }
Example #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="NtsProvider"/> class
 /// from another <see cref="SharpMap.Data.Providers.IFeatureProvider" />.
 /// </summary>
 /// <param name="provider">
 /// The base <see cref="SharpMap.Data.Providers.IFeatureProvider"/>
 /// from witch initialize the <see cref="NtsProvider"/> instance.
 /// </param>
 /// <param name="operation">
 /// The <see cref="GeometryOperationDelegate"/> to apply
 /// to all geometry elements in the <paramref name="provider"/>.
 /// </param>
 /// <param name="precisionModel">
 /// The <see cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel"/>
 /// to use for define the precision of the geometry operations.
 /// </param>
 /// <seealso cref="PrecisionModels"/>
 /// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory"/>
 public NtsProvider(SharpMap.Data.Providers.IFeatureProvider provider, GeometryOperationDelegate operation,
                    GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel precisionModel) : this(provider, precisionModel)
 {
     operation(features);
 }
Example #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="NtsProvider"/> class
 /// from another <see cref="SharpMap.Data.Providers.IFeatureProvider" />.
 /// </summary>
 /// <param name="provider">
 /// The base <see cref="SharpMap.Data.Providers.IFeatureProvider"/>
 /// from witch initialize the <see cref="NtsProvider"/> instance.
 /// </param>
 /// <param name="precisionModel">
 /// The <see cref="GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel"/>
 /// to use for define the precision of the geometry operations.
 /// </param>
 /// <seealso cref="PrecisionModels"/>
 /// <seealso cref="GisSharpBlog.NetTopologySuite.Geometries.GeometryFactory"/>
 public NtsProvider(SharpMap.Data.Providers.IFeatureProvider provider,
                    GisSharpBlog.NetTopologySuite.Geometries.PrecisionModel precisionModel) : this(precisionModel)
 {
     BuildFromProvider(provider);
 }
Example #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="NtsProvider"/> class
 /// from another <see cref="SharpMap.Data.Providers.IFeatureProvider" />.
 /// </summary>
 /// <param name="provider">
 /// The base <see cref="SharpMap.Data.Providers.IFeatureProvider"/>
 /// from witch initialize the <see cref="NtsProvider"/> instance.
 /// </param>
 /// <param name="operation">
 /// The <see cref="GeometryOperationDelegate"/> to apply
 /// to all geometry elements in the <paramref name="provider"/>.
 /// </param>
 public NtsProvider(SharpMap.Data.Providers.IFeatureProvider provider, GeometryOperationDelegate operation) : this(provider)
 {
     operation(features);
 }
Example #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="NtsProvider"/> class
 /// from another <see cref="SharpMap.Data.Providers.IFeatureProvider" />.
 /// </summary>
 /// <param name="provider">
 /// The base <see cref="SharpMap.Data.Providers.IFeatureProvider"/>
 /// from witch initialize the <see cref="NtsProvider"/> instance.
 /// </param>
 public NtsProvider(SharpMap.Data.Providers.IFeatureProvider provider) : this()
 {
     BuildFromProvider(provider);
 }