コード例 #1
0
        protected virtual string InsertClause(IDbCommand cmd)
        {
            List <string> sets = new List <string>();

            //Columnnames
            DataColumnCollection dcc = GetSchemaTable().Columns;

            foreach (DataColumn dc in dcc)
            {
                sets.Add(string.Format(" [{0}]", dc.ColumnName));
            }

            String columNames = string.Format("({0}, [{1}])", String.Join(",", sets.ToArray()).Trim(), GeometryColumn);

            sets.Clear();

            //Parameter
            foreach (DataColumn dc in dcc)
            {
                IDataParameter param = null;
                sets.Add(string.Format(" {0}", ParamForColumn(dc, out param)));
                cmd.Parameters.Add(param);
            }

            //Geometry
            sets.Add(string.Format("{0}", string.Format(GeomFromWkbFormatString, "@PGeo")));
            cmd.Parameters.Add(DbUtility.CreateParameter <byte[]>("@PGeo", ParameterDirection.Input));

            return(String.Format("{0} VALUES({1})", columNames, string.Join(",", sets.ToArray()).Trim()));
        }
コード例 #2
0
        protected virtual String ParamForColumn(DataColumn dc, out IDataParameter param)
        {
            String paramName = ParamForColumn(dc);

            param = DbUtility.CreateParameter(paramName, dc.DataType, ParameterDirection.Input);
            return(paramName);
        }
コード例 #3
0
        protected override void ReadSpatialReference(out ICoordinateSystem cs, out string srid)
        {
            using (IDbConnection conn = DbUtility.CreateConnection(ConnectionString))
            {
                using (IDbCommand cmd = DbUtility.CreateCommand())
                {
                    cmd.Connection  = conn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText =
                        "SELECT TOP 1 SRID from ST.GEOMETRY_COLUMNS WHERE F_TABLE_SCHEMA = @pschema and F_TABLE_NAME = @ptablename";

                    cmd.Parameters.Add(DbUtility.CreateParameter("pschema", TableSchema, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("ptablename", Table, ParameterDirection.Input));
                    conn.Open();
                    object result = cmd.ExecuteScalar();
                    if (result is int)
                    {
                        int isrid = (int)result;
                        cs   = SridMap.DefaultInstance.Process(isrid, (ICoordinateSystem)null);
                        srid = !Equals(cs, default(ICoordinateSystem)) ? SridMap.DefaultInstance.Process(cs, "") : "";
                        return;
                    }
                }
            }
            cs   = default(ICoordinateSystem);
            srid = "";
        }
コード例 #4
0
        public PostGisProvider(IGeometryFactory geometryFactory, string connectionString,
                               string tableSchema, string tableName, string oidColumn, string geometryColumn,
                               ICoordinateTransformationFactory coordinateTransformationFactory)
            : base(
                new PostGisDbUtility(), geometryFactory, connectionString, tableSchema,
                tableName,
                oidColumn,
                geometryColumn,
                coordinateTransformationFactory)
        {
            using (NpgsqlConnection cn = (NpgsqlConnection)DbUtility.CreateConnection(connectionString))
            {
                try
                {
                    cn.Open();

                    if (!PostGisProviderStatic.Has_X_Privilege(cn, "table", "\"public\".\"geometry_columns\"", "SELECT"))
                    {
                        throw new PostGisException(
                                  "Insufficient rights to access table \"public\".\"geometry_columns\"!");
                    }

                    if (
                        !PostGisProviderStatic.Has_X_Privilege(cn, "table",
                                                               string.Format("\"{0}\".\"{1}\"", tableSchema, tableName),
                                                               "SELECT"))
                    {
                        throw new PostGisException(string.Format(
                                                       "Insufficient rights to access table \"{0}\".\"{1}\"!",
                                                       tableSchema, tableName));
                    }

                    NpgsqlCommand cmd = (NpgsqlCommand)DbUtility.CreateCommand();
                    cmd.Connection  = cn;
                    cmd.CommandText =
                        @"SELECT x.""type""
    FROM ""public"".""geometry_columns"" AS x
    WHERE (x.""f_table_schema""=:p0 AND x.""f_table_name""=:p1 AND x.""f_geometry_column""=:p2);";
                    cmd.Parameters.Add(DbUtility.CreateParameter("p0", tableSchema, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p1", tableName, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p2", geometryColumn, ParameterDirection.Input));

                    NpgsqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    if (dr.HasRows)
                    {
                        dr.Read();
                        //valid geometry type
                        _validGeometryType = parseGeometryType(dr.GetString(0));
                    }
                    else
                    {
                        _validGeometryType = OgcGeometryType.Geometry;
                    }
                }
                catch (Exception)
                {
                    _validGeometryType = OgcGeometryType.Unknown;
                }
            }
        }
コード例 #5
0
        protected override string InsertClause(IDbCommand cmd)
        {
            var sets = new List <string>();

            //Columnnames
            DataColumnCollection dcc = GetSchemaTable().Columns;

            foreach (DataColumn dc in dcc)
            {
                sets.Add(string.Format(" \"{0}\"", dc.ColumnName));
            }

            String columNames = string.Format("({0}, \"{1}\")", String.Join(",", sets.ToArray()).Trim(), GeometryColumn);

            sets.Clear();

            //Parameter
            foreach (DataColumn dc in dcc)
            {
                IDataParameter param = null;
                sets.Add(string.Format(" :{0}", ParamForColumn(dc, out param)));
                cmd.Parameters.Add(param);
            }

            //Geometry
            sets.Add(string.Format("{0}", string.Format(GeomFromWkbFormatString, ":PGeo")));
            //cmd.Parameters.Add(DbUtility.CreateParameterByType("PGeo", toDbType(typeof(byte[])), ParameterDirection.Input));
            cmd.Parameters.Add(DbUtility.CreateParameter <byte[]>("PGeo", ParameterDirection.Input));
            return(String.Format("{0} VALUES({1})", columNames, string.Join(",", sets.ToArray()).Trim()));
        }
コード例 #6
0
        protected virtual string UpdateClause(IDbCommand cmd)
        {
            List <string> sets = new List <string>();

            //Attribute
            foreach (DataColumn dc in GetSchemaTable().Columns)
            {
                IDataParameter param = null;
                sets.Add(string.Format(" [{0}]={1}", dc.ColumnName, ParamForColumn(dc, out param)));
                cmd.Parameters.Add(param);
            }
            //Geometry
            sets.Add(
                string.Format("[{0}]={1}",
                              GeometryColumn,
                              string.Format(GeomFromWkbFormatString, "@PGeo")));
            cmd.Parameters.Add(DbUtility.CreateParameter <byte[]>("@PGeo", ParameterDirection.Input));

            return(String.Join(",", sets.ToArray()).Trim());
        }
コード例 #7
0
        public virtual void Insert(IEnumerable <FeatureDataRow <TOid> > features)
        {
            OgcGeometryType geometryType = OgcGeometryType.Unknown;

            using (IDbConnection conn = DbUtility.CreateConnection(ConnectionString))
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                using (IDbTransaction tran = conn.BeginTransaction())
                {
                    IDbCommand cmd = DbUtility.CreateCommand();
                    cmd.Connection  = conn;
                    cmd.Transaction = tran;

                    cmd.CommandText = string.Format(
                        "INSERT INTO {0} {1};", QualifiedTableName, InsertClause(cmd));

                    int geometryParameterIndex = cmd.Parameters.Count - 1;
                    foreach (FeatureDataRow <TOid> row in features)
                    {
                        if (cmd.Parameters.Count > 0)
                        {
                            for (int i = 0; i < row.FieldCount; i++)
                            {
                                ((IDataParameter)cmd.Parameters[i]).Value = row.GetValue(i);
                            }
                            ((IDataParameter)cmd.Parameters[geometryParameterIndex]).Value =
                                row.Geometry.AsBinary();
                        }
                        else
                        {
                            for (int i = 0; i < row.FieldCount; i++)
                            {
                                cmd.Parameters.Add(DbUtility.CreateParameter(string.Format("P{0}", i), row[i],
                                                                             ParameterDirection.Input));
                            }

                            geometryParameterIndex = cmd.Parameters.Add(
                                DbUtility.CreateParameter("PGeo", row.Geometry.AsBinary(),
                                                          ParameterDirection.Input));
                        }

                        //for (int i = 0; i < cmd.Parameters.Count - 1; i++)
                        //    ((IDataParameter)cmd.Parameters[i]).Value = row[i];
                        //byte[] geomBinary = row.Geometry.AsBinary();
                        //((IDataParameter)cmd.Parameters["@PGeo"]).Value = geomBinary;

                        if (geometryType == OgcGeometryType.Unknown)
                        {
                            geometryType = row.Geometry.GeometryType;
                        }

                        if (row.Geometry.GeometryType == geometryType)
                        {
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tran.Commit();
                }
            }
        }
コード例 #8
0
 protected virtual string WhereClause(IDbCommand cmd)
 {
     cmd.Parameters.Add(DbUtility.CreateParameter <TOid>("@POldOid", ParameterDirection.Input));
     return(string.Format("{0}=@POldOid", OidColumn));
 }
コード例 #9
0
        //TODO: add a set of strategies for reading srid
        protected override void ReadSpatialReference(out ICoordinateSystem cs, out string srid)
        {
            using (IDbConnection conn = DbUtility.CreateConnection(ConnectionString))
            {
                using (IDbCommand cmd = DbUtility.CreateCommand())
                {
                    cmd.Connection  = conn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText =
                        string.Format(
                            @"
DECLARE @found bit 
set @found = 0; 
IF EXISTS(select * from sys.objects where object_id = object_id(@p1 + '.Geometry_Columns'))
    BEGIN
    IF  EXISTS(SELECT * FROM [{1}].[Geometry_Columns] WHERE F_Table_Catalog = @p0 AND F_Table_Schema = @p1 AND F_Table_Name = @p2 AND F_Geometry_Column = @p3)
        BEGIN
            SELECT DISTINCT SRID FROM [{1}].[Geometry_Columns] WHERE F_Table_Catalog = @p0 AND F_Table_Schema = @p1 AND F_Table_Name = @p2 AND F_Geometry_Column = @p3 
            SET @found = 1
        END
    END
IF @found = 0
    BEGIN
        SELECT DISTINCT [{0}].STSrid FROM [{1}].[{2}] 
    END",
                            GeometryColumn, TableSchema, Table);
                    cmd.Parameters.Add(DbUtility.CreateParameter("p0", conn.Database, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p1", TableSchema, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p2", Table, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p3", GeometryColumn, ParameterDirection.Input));

                    conn.Open();
                    using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        while (reader.Read())
                        {
                            if (reader.RecordsAffected > 1)
                            {
                                throw new Exception(
                                          string.Format(
                                              "The Sql Server Table [{0}].[{1}] contains geometries in multiple Srids.",
                                              TableSchema, Table));
                            }

                            object v = reader[0];
                            if (v is int)
                            {
                                int isrid = (int)v;
                                cs   = SridMap.DefaultInstance.Process(isrid, default(ICoordinateSystem));
                                srid = !Equals(cs, default(ICoordinateSystem))
                                           ? SridMap.DefaultInstance.Process(cs, String.Empty)
                                           : String.Empty;

                                return;
                            }
                        }
                    }
                }
            }
            cs   = default(ICoordinateSystem);
            srid = String.Empty;
        }
コード例 #10
0
 protected override string WhereClause(IDbCommand cmd)
 {
     cmd.Parameters.Add(DbUtility.CreateParameter <UInt32>(":POldOid", ParameterDirection.Input));
     return(string.Format("{0}=:POldOid", OidColumn));
 }