Esempio n. 1
0
        public bool ImportToNewFeatureclass(IFeatureDataset destDS, string fcname, IFeatureClass sourceFC, FieldTranslation fieldTranslation, bool project, List <IQueryFilter> filters)
        {
            if (destDS == null)
            {
                return(false);
            }

            DatasetNameCase nameCase = DatasetNameCase.ignore;

            foreach (System.Attribute attribute in System.Attribute.GetCustomAttributes(destDS.GetType()))
            {
                if (attribute is UseDatasetNameCase)
                {
                    nameCase = ((UseDatasetNameCase)attribute).Value;
                }
            }
            return(ImportToNewFeatureclass(destDS, fcname, sourceFC, fieldTranslation, project, filters, nameCase));
        }
Esempio n. 2
0
 public UseDatasetNameCase(DatasetNameCase nameCase)
 {
     _case = nameCase;
 }
Esempio n. 3
0
        private bool ImportToNewFeatureclass(IFeatureDataset destDS, string fcname, IFeatureClass sourceFC, FieldTranslation fieldTranslation, bool project, List <IQueryFilter> filters, DatasetNameCase namecase)
        {
            if (!_cancelTracker.Continue)
            {
                return(true);
            }

            switch (namecase)
            {
            case DatasetNameCase.upper:
                fcname = fcname.ToUpper();
                fieldTranslation.ToUpper();
                break;

            case DatasetNameCase.lower:
                fcname = fcname.ToLower();
                fieldTranslation.ToLower();
                break;

            case DatasetNameCase.classNameUpper:
                fcname = fcname.ToUpper();
                break;

            case DatasetNameCase.classNameLower:
                fcname = fcname.ToLower();
                break;

            case DatasetNameCase.fieldNamesUpper:
                fieldTranslation.ToUpper();
                break;

            case DatasetNameCase.fieldNamesLower:
                fieldTranslation.ToLower();
                break;
            }
            try
            {
                fcname = fcname.Replace(".", "_");

                if (destDS == null)
                {
                    _errMsg = "Argument Exception";
                    return(false);
                }
                IFeatureDatabase fdb = destDS.Database as IFeatureDatabase;
                if (!(fdb is IFeatureUpdater))
                {
                    _errMsg = "Database don't implement IFeatureUpdater...";
                    return(false);
                }

                IDatasetElement destLayer = destDS[fcname] as IDatasetElement;
                if (destLayer != null)
                {
                    if (ReportRequest != null)
                    {
                        RequestArgs args = new RequestArgs(
                            "Featureclass " + fcname + " already exists in database\nDo want to replace it?",
                            MessageBoxButtons.YesNoCancel,
                            DialogResult.Cancel);
                        ReportRequest(this, args);
                        switch (args.Result)
                        {
                        case DialogResult.No:
                            return(true);

                        case DialogResult.Cancel:
                            _errMsg = "Import is canceled by the user...";
                            return(false);
                        }
                    }
                }

                if (destLayer != null)
                {
                    fdb.DeleteFeatureClass(fcname);
                }
                int fcID = fdb.CreateFeatureClass(destDS.DatasetName,
                                                  fcname,
                                                  sourceFC,
                                                  (fieldTranslation == null) ?
                                                  ((sourceFC.Fields != null) ? (IFields)sourceFC.Fields.Clone() : new Fields()) :
                                                  fieldTranslation.DestinationFields);
                if (fcID < 0)
                {
                    _errMsg = "Can't create featureclass " + fcname + "...\r\n" + fdb.lastErrorMsg;
                    destDS.Dispose();
                    return(false);
                }

                destLayer = destDS[fcname] as IDatasetElement;

                if (destLayer == null || !(destLayer.Class is IFeatureClass))
                {
                    _errMsg = "Can't load featureclass " + fcname + "...\r\n" + destDS.lastErrorMsg;
                    destDS.Dispose();
                    return(false);
                }
                IFeatureClass destFC = destLayer.Class as IFeatureClass;

                if (project && destFC.SpatialReference != null && !destFC.SpatialReference.Equals(sourceFC.SpatialReference))
                {
                    _transformer = new GeometricTransformer();
                    //_transformer.FromSpatialReference = sourceFC.SpatialReference;
                    //_transformer.ToSpatialReference = destFC.SpatialReference;
                    _transformer.SetSpatialReferences(sourceFC.SpatialReference, destFC.SpatialReference);
                }

                if (_cancelTracker.Continue)
                {
                    bool result = true;

                    if (fdb is IFeatureImportEvents)
                    {
                        ((IFeatureImportEvents)fdb).BeforeInsertFeaturesEvent(sourceFC, destFC);
                    }

                    if (!_schemaOnly)
                    {
                        result = CopyFeatures(sourceFC, fdb, destFC, fieldTranslation, filters);
                    }
                    if (!result)
                    {
                        fdb.DeleteFeatureClass(fcname);
                        destDS.Dispose();
                        return(false);
                    }

                    if (fdb is IFeatureImportEvents)
                    {
                        ((IFeatureImportEvents)fdb).AfterInsertFeaturesEvent(sourceFC, destFC);
                    }
                }

                if (fdb is IFileFeatureDatabase)
                {
                    if (!((IFileFeatureDatabase)fdb).Flush(destFC))
                    {
                        _errMsg = "Error executing flush for file database...";
                        return(false);
                    }
                }
                destDS.Dispose();

                if (_cancelTracker.Continue)
                {
                    return(true);
                }
                else
                {
                    fdb.DeleteFeatureClass(fcname);
                    _errMsg = "Import is canceled by the user...";
                    return(false);
                }
            }
            finally
            {
                if (_transformer != null)
                {
                    _transformer.Release();
                    _transformer = null;
                }
            }
        }
Esempio n. 4
0
        virtual public bool Insert(IFeatureClass fClass, List <IFeature> features)
        {
            DatasetNameCase nameCase = DatasetNameCase.ignore;

            foreach (System.Attribute attribute in System.Attribute.GetCustomAttributes(this.GetType()))
            {
                if (attribute is UseDatasetNameCase)
                {
                    nameCase = ((UseDatasetNameCase)attribute).Value;
                }
            }

            if (fClass == null)
            {
                return(false);
            }

            if (!CanEditFeatureClass(fClass, EditCommands.Insert))
            {
                return(false);
            }

            try
            {
                int srid = 0;
                if (fClass.SpatialReference != null)
                {
                    string sridName = fClass.SpatialReference.Name;
                    if (sridName.ToLower().StartsWith("epsg:"))
                    {
                        srid = int.Parse(sridName.Split(':')[1]);
                    }
                }

                using (DbConnection connection = this.ProviderFactory.CreateConnection())
                {
                    connection.ConnectionString = _connectionString;
                    connection.Open();

                    DbCommand command = this.ProviderFactory.CreateCommand();
                    command.Connection = connection;
                    foreach (IFeature feature in features)
                    {
                        StringBuilder fields = new StringBuilder(), parameters = new StringBuilder();
                        command.Parameters.Clear();
                        if (feature.Shape != null)
                        {
                            bool   asParameter;
                            object shapeObject = this.ShapeParameterValue((OgcSpatialFeatureclass)fClass, feature.Shape,
                                                                          feature.Shape.Srs != null && feature.Shape.Srs > 0 ? (int)feature.Shape.Srs : srid,
                                                                          out asParameter);
                            if (asParameter == true)
                            {
                                DbParameter parameter = this.ProviderFactory.CreateParameter();
                                parameter.ParameterName = "@" + fClass.ShapeFieldName;
                                parameter.Value         = shapeObject != null ? shapeObject : DBNull.Value;
                                fields.Append("\"" + fClass.ShapeFieldName + "\"");

                                string paramExpresssion = InsertShapeParameterExpression((OgcSpatialFeatureclass)fClass, feature.Shape);
                                if (!String.IsNullOrWhiteSpace(paramExpresssion))
                                {
                                    paramExpresssion = String.Format(paramExpresssion, "@" + fClass.ShapeFieldName);
                                }
                                else
                                {
                                    paramExpresssion = "@" + fClass.ShapeFieldName;
                                }
                                parameters.Append(paramExpresssion);
                                command.Parameters.Add(parameter);
                            }
                            else
                            {
                                fields.Append("\"" + fClass.ShapeFieldName + "\"");
                                parameters.Append(shapeObject.ToString());
                            }
                        }

                        foreach (IFieldValue fv in feature.Fields)
                        {
                            string fvName = fv.Name;
                            switch (nameCase)
                            {
                            case DatasetNameCase.lower:
                            case DatasetNameCase.classNameLower:
                                fvName = fvName.ToLower();
                                break;

                            case DatasetNameCase.upper:
                            case DatasetNameCase.classNameUpper:
                                fvName = fvName.ToUpper();
                                break;
                            }

                            if (fvName == fClass.IDFieldName || fvName == fClass.ShapeFieldName)
                            {
                                continue;
                            }

                            IField field = fClass.FindField(fvName);
                            if (field == null)
                            {
                                continue;
                            }

                            if (fields.Length != 0)
                            {
                                fields.Append(",");
                            }
                            if (parameters.Length != 0)
                            {
                                parameters.Append(",");
                            }

                            object val = fv.Value;

                            DbParameter parameter = this.ProviderFactory.CreateParameter();
                            parameter.ParameterName = "@" + fvName;
                            try
                            {
                                parameter.Value = val;
                            }
                            catch
                            {
                                if (val != null)
                                {
                                    parameter.Value = val.ToString();
                                }
                            }
                            //NpgsqlParameter parameter = new NpgsqlParameter("@" + fv.Name, val);

                            fields.Append("\"" + fvName + "\"");
                            parameters.Append("@" + fvName);
                            command.Parameters.Add(parameter);
                        }

                        command.CommandText = "INSERT INTO " + fClass.Name + " (" + fields.ToString() + ") VALUES (" + parameters + ")";
                        try
                        {
                            command.CommandTimeout = 600;
                            command.ExecuteNonQuery();
                        }
                        catch (Exception ex)
                        {
                            _errMsg = ex.Message;
                            return(false);
                        }
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                _errMsg = ex.Message;
                return(false);
            }
        }
Esempio n. 5
0
        virtual public int CreateFeatureClass(string dsname, string fcname, IGeometryDef geomDef, IFields Fields)
        {
            DatasetNameCase nameCase = DatasetNameCase.ignore;

            foreach (System.Attribute attribute in System.Attribute.GetCustomAttributes(this.GetType()))
            {
                if (attribute is UseDatasetNameCase)
                {
                    nameCase = ((UseDatasetNameCase)attribute).Value;
                }
            }
            switch (nameCase)
            {
            case DatasetNameCase.lower:
            case DatasetNameCase.classNameLower:
                fcname = fcname.ToLower();
                break;

            case DatasetNameCase.upper:
            case DatasetNameCase.classNameUpper:
                fcname = fcname.ToUpper();
                break;
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("CREATE TABLE " + fcname + " \n(\n");

            Field idField = new Field(OgcDictionary("gid"), FieldType.ID);

            sb.Append(OgcDictionary("gid") + " ");
            sb.Append(DbDictionary(idField));

            Field shapeField = new Field(OgcDictionary("the_geom"), FieldType.Shape);

            if (!String.IsNullOrEmpty(DbDictionary(shapeField)))
            {
                sb.Append(",\n");
                sb.Append(OgcDictionary("the_geom") + " ");
                sb.Append(DbDictionary(shapeField));
            }

            foreach (IField field in Fields.ToEnumerable())
            {
                if (field.type == FieldType.ID ||
                    field.type == FieldType.Shape)
                {
                    continue;
                }

                string fieldName = field.name;
                switch (nameCase)
                {
                case DatasetNameCase.lower:
                case DatasetNameCase.classNameLower:
                    fieldName = fieldName.ToLower();
                    break;

                case DatasetNameCase.upper:
                case DatasetNameCase.classNameUpper:
                    fieldName = fieldName.ToUpper();
                    break;
                }

                sb.Append(",\n");
                sb.Append(" \"" + fieldName + "\" ");

                sb.Append(DbDictionary(field));
            }

            //sb.Append(" the_geom  geometry,\n");
            string geomTypeString = "";

            switch (geomDef.GeometryType)
            {
            case geometryType.Point:
                geomTypeString = "POINT";
                break;

            case geometryType.Polyline:
                geomTypeString = "MULTILINESTRING";
                break;

            case geometryType.Polygon:
                geomTypeString = "MULTIPOLYGON";
                break;

            default:
                _errMsg = "Geometrytype not implemented...";
                return(-1);
            }

            sb.Append(")\n");
            try
            {
                using (DbConnection connection = this.ProviderFactory.CreateConnection())
                {
                    connection.ConnectionString = _connectionString;
                    connection.Open();

                    DbCommand command = this.ProviderFactory.CreateCommand();
                    command.CommandText = sb.ToString();
                    command.Connection  = connection;
                    command.ExecuteNonQuery();

                    command.CommandText = CreateGidSequence(fcname);
                    if (!String.IsNullOrEmpty(command.CommandText))
                    {
                        command.ExecuteNonQuery();
                    }
                    command.CommandText = CreateGidTrigger(fcname, OgcDictionary("gid"));
                    if (!String.IsNullOrEmpty(command.CommandText))
                    {
                        command.ExecuteNonQuery();
                    }

                    command.CommandText = AddGeometryColumn("", fcname, OgcDictionary("the_geom"), "-1", geomTypeString);
                    if (!String.IsNullOrEmpty(command.CommandText))
                    {
                        command.ExecuteNonQuery();
                    }
                }
                return(0);
            }
            catch (Exception ex)
            {
                _errMsg = ex.Message;
                return(-1);
            }
        }
Esempio n. 6
0
        async virtual public Task <bool> Insert(IFeatureClass fClass, List <IFeature> features)
        {
            DatasetNameCase nameCase = DatasetNameCase.ignore;

            foreach (System.Attribute attribute in System.Attribute.GetCustomAttributes(this.GetType()))
            {
                if (attribute is UseDatasetNameCase)
                {
                    nameCase = ((UseDatasetNameCase)attribute).Value;
                }
            }

            if (fClass == null)
            {
                return(false);
            }

            if (!CanEditFeatureClass(fClass, EditCommands.Insert))
            {
                return(false);
            }

            try
            {
                int srid = 0;
                if (fClass.SpatialReference != null)
                {
                    string sridName = fClass.SpatialReference.Name;
                    if (sridName.ToLower().StartsWith("epsg:"))
                    {
                        srid = int.Parse(sridName.Split(':')[1]);
                    }
                }

                using (DbConnection connection = this.ProviderFactory.CreateConnection())
                {
                    connection.ConnectionString = _connectionString;
                    await connection.OpenAsync();

                    using (var transaction = this.DbImplementsTransactions ? connection.BeginTransaction() : new FakeTransaction(connection))
                    {
                        DbCommand command = this.ProviderFactory.CreateCommand();
                        command.Connection = connection;

                        if (this.DbImplementsTransactions)
                        {
                            command.Transaction = transaction;
                        }

                        StringBuilder commandText = new StringBuilder();

                        foreach (IFeature feature in features)
                        {
                            StringBuilder fields = new StringBuilder(), parameters = new StringBuilder();
                            command.Parameters.Clear();
                            if (feature.Shape != null)
                            {
                                var shape = ValidateGeometry(fClass, feature.Shape);

                                bool   asParameter;
                                object shapeObject = this.ShapeParameterValue((OgcSpatialFeatureclass)fClass, shape,
                                                                              shape.Srs != null && shape.Srs > 0 ? (int)shape.Srs : srid,
                                                                              out asParameter);

                                if (asParameter == true)
                                {
                                    DbParameter parameter = this.ProviderFactory.CreateParameter();
                                    parameter.ParameterName = this.DbParameterName(fClass.ShapeFieldName);
                                    parameter.Value         = shapeObject != null ? shapeObject : DBNull.Value;
                                    fields.Append(this.DbColumnName(fClass.ShapeFieldName));

                                    string paramExpresssion = InsertShapeParameterExpression((OgcSpatialFeatureclass)fClass, shape);
                                    if (!String.IsNullOrWhiteSpace(paramExpresssion))
                                    {
                                        paramExpresssion = String.Format(paramExpresssion, this.DbParameterName(fClass.ShapeFieldName));
                                    }
                                    else
                                    {
                                        paramExpresssion = this.DbParameterName(fClass.ShapeFieldName);
                                    }

                                    parameters.Append(paramExpresssion);
                                    command.Parameters.Add(parameter);
                                }
                                else
                                {
                                    fields.Append(this.DbColumnName(fClass.ShapeFieldName));
                                    parameters.Append(shapeObject.ToString());
                                }
                            }

                            #region Unmanaged Ids (eg SDE)

                            if (!HasManagedRowIds(fClass))
                            {
                                var rowId = await GetNextInsertRowId(fClass);

                                if (rowId.HasValue)
                                {
                                    var idFieleValue = feature.Fields.Where(f => f.Name.Equals(fClass.IDFieldName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                                    if (idFieleValue == null)
                                    {
                                        idFieleValue = new FieldValue(fClass.IDFieldName);
                                        feature.Fields.Add(idFieleValue);
                                    }
                                    idFieleValue.Value = rowId;
                                }
                            }

                            #endregion

                            foreach (IFieldValue fv in feature.Fields)
                            {
                                string fvName = fv.Name;
                                switch (nameCase)
                                {
                                case DatasetNameCase.lower:
                                case DatasetNameCase.classNameLower:
                                    fvName = fvName.ToLower();
                                    break;

                                case DatasetNameCase.upper:
                                case DatasetNameCase.classNameUpper:
                                    fvName = fvName.ToUpper();
                                    break;
                                }

                                if (fvName == fClass.IDFieldName && HasManagedRowIds(fClass))
                                {
                                    continue;
                                }
                                if (fvName == fClass.ShapeFieldName)
                                {
                                    continue;
                                }

                                IField field = fClass.FindField(fvName);
                                if (field == null)
                                {
                                    continue;
                                }

                                if (fields.Length != 0)
                                {
                                    fields.Append(",");
                                }

                                if (parameters.Length != 0)
                                {
                                    parameters.Append(",");
                                }

                                object val = fv.Value;

                                DbParameter parameter = this.ProviderFactory.CreateParameter();
                                parameter.ParameterName = DbParameterName(fvName);
                                try
                                {
                                    parameter.Value = field.TryConvertType(val);
                                }
                                catch
                                {
                                    if (val != null)
                                    {
                                        parameter.Value = val.ToString();
                                    }
                                }
                                //NpgsqlParameter parameter = new NpgsqlParameter("@" + fv.Name, val);

                                fields.Append(this.DbColumnName(fvName));
                                parameters.Append(DbParameterName(fvName));
                                command.Parameters.Add(parameter);
                            }

                            command.CommandText = "INSERT INTO " + fClass.Name + " (" + fields.ToString() + ") VALUES (" + parameters + ")";
                            await command.ExecuteNonQueryAsync();
                        }

                        try
                        {
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw ex;
                        }
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                _errMsg = ex.Message;
                return(false);
            }
        }