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)); }
public UseDatasetNameCase(DatasetNameCase nameCase) { _case = nameCase; }
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; } } }
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); } }
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); } }
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); } }