/// <summary> /// Executes the operation /// </summary> /// <param name="rows"></param> /// <returns></returns> public override IEnumerable <FdoRow> Execute(IEnumerable <FdoRow> rows) { foreach (FdoFeature feat in _table.Rows) { yield return(FdoRow.FromFeatureRow(feat)); } }
private FdoRow ConvertValues(FdoRow row) { foreach (string propertyName in _rules.Keys) { if (row[propertyName] != null) { FdoDataPropertyConversionRule rule = _rules[propertyName]; LiteralValue old = ValueConverter.GetConvertedValue(row[propertyName]); if (old.LiteralValueType == LiteralValueType.LiteralValueType_Data) { DataValue converted = ValueConverter.ConvertDataValue((DataValue)old, rule.TargetDataType, rule.NullOnFailure, rule.Truncate); row[propertyName] = ValueConverter.GetClrValue(converted); if (converted != null) { converted.Dispose(); } else { if (!rule.NullOnFailure) { throw new FdoException("Converting " + old + " to " + rule.TargetDataType + " resulted in a NULL value"); } } old.Dispose(); } } } return(row); }
private FdoRow ConvertValues(FdoRow row) { foreach(string propertyName in _rules.Keys) { if (row[propertyName] != null) { FdoDataPropertyConversionRule rule = _rules[propertyName]; LiteralValue old = ValueConverter.GetConvertedValue(row[propertyName]); if (old.LiteralValueType == LiteralValueType.LiteralValueType_Data) { DataValue converted = ValueConverter.ConvertDataValue((DataValue)old, rule.TargetDataType, rule.NullOnFailure, rule.Truncate); row[propertyName] = ValueConverter.GetClrValue(converted); if (converted != null) { converted.Dispose(); } else { if (!rule.NullOnFailure) throw new FdoException("Converting " + old + " to " + rule.TargetDataType + " resulted in a NULL value"); } old.Dispose(); } } } return row; }
private FdoRow Flatten(FdoRow row) { //Not applicable? if (row.Geometry == null) { return(row); } //Already 2D? Move along! if (FdoGeometryUtil.Is2D(row.Geometry)) { return(row); } IGeometry geom = row.Geometry; IGeometry trans = FdoGeometryUtil.Flatten(geom, _geomFactory); //Dispose the original if flatten returned a new instance if (!IGeometry.ReferenceEquals(geom, trans)) { row.Geometry = trans; geom.Dispose(); } return(row); }
private string BuildSql(FdoRow obj) { if (IsUsingPropertyMappings()) { string[] values = new string[_mappings.Count]; int i = 0; foreach (string target in _mappings.Keys) { string name = _mappings[target]; if (obj[name] != null) { if (obj.IsGeometryProperty(name)) { values[i] = VALUE_BEGIN + ((IGeometry)obj[name]).Text + VALUE_END; } else if (obj[name].GetType() == typeof(string)) { values[i] = VALUE_BEGIN + EscapeValue((string)obj[name]) + VALUE_END; } else if (obj[name].GetType() == typeof(DateTime)) { values[i] = VALUE_BEGIN + ((DateTime)obj[name]).ToString(ISO8601_FMT) + VALUE_END; } else { values[i] = VALUE_BEGIN + obj[name].ToString() + VALUE_END; } } else { values[i] = GetNullValue(); } i++; } return(string.Format(_sqlTpl, values)); } else { string[] values = new string[_propertyTraversalList.Count]; for (int i = 0; i < values.Length; i++) { string name = _propertyTraversalList[i]; if (obj[name] != null) { values[i] = VALUE_BEGIN + obj[name].ToString() + VALUE_END; } else if (obj[name].GetType() == typeof(DateTime)) { values[i] = VALUE_BEGIN + ((DateTime)obj[name]).ToString(ISO8601_FMT) + VALUE_END; } else { values[i] = GetNullValue(); } } return(string.Format(_sqlTpl, values)); } }
/// <summary> /// Executes the operation /// </summary> /// <param name="rows"></param> /// <returns></returns> public override IEnumerable <FdoRow> Execute(IEnumerable <FdoRow> rows) { using (FdoFeatureService service = _conn.CreateFeatureService()) { using (FdoFeatureReader reader = service.SelectFeatures(this.Query)) { ClassDefinition cd = reader.GetClassDefinition(); foreach (PropertyDefinition pd in cd.Properties) { if (pd.PropertyType == PropertyType.PropertyType_RasterProperty) { ignoreProperties.Add(pd.Name); } else if (pd.PropertyType == PropertyType.PropertyType_DataProperty) { DataPropertyDefinition dp = pd as DataPropertyDefinition; if (dp.IsAutoGenerated || dp.ReadOnly) { ignoreProperties.Add(pd.Name); } } else if (pd.PropertyType == PropertyType.PropertyType_GeometricProperty) { GeometricPropertyDefinition gp = pd as GeometricPropertyDefinition; if (gp.ReadOnly) { ignoreProperties.Add(gp.Name); } } } while (reader.ReadNext()) { FdoRow row = null; try { row = CreateRowFromReader(reader); } catch (Exception ex) { if (row != null) { RaiseFailedFeatureProcessed(row, ex); } else { RaiseFailedReadFeature(ex.Message, ex); } } if (row != null) { yield return(row); } } } } }
/// <summary> /// Called when a row is processed. /// </summary> /// <param name="op">The operation.</param> /// <param name="dictionary">The dictionary.</param> protected override void OnFeatureProcessed(FdoOperationBase op, FdoRow dictionary) { if (op.Statistics.OutputtedRows % this.ReportFrequency == 0) { if (op is FdoOutputOperation) { string className = (op as FdoOutputOperation).ClassName; SendMessageFormatted("[{0}]: {1} features processed", this.Name, op.Statistics.OutputtedRows); } } }
/// <summary> /// Executes this operation /// </summary> /// <param name="ignored">Ignored rows</param> /// <returns></returns> public override IEnumerable <FdoRow> Execute(IEnumerable <FdoRow> ignored) { PrepareForJoin(); IEnumerable <FdoRow> rightEnumerable = GetRightEnumerable(); IEnumerable <FdoRow> execute = left.Execute(null); foreach (FdoRow leftRow in new EventRaisingEnumerator(left, execute)) { ObjectArrayKeys key = leftRow.CreateKey(leftColumns); List <FdoRow> rightRows; if (this.rightRowsByJoinKey.TryGetValue(key, out rightRows)) { foreach (FdoRow rightRow in rightRows) { rightRowsWereMatched[rightRow] = null; yield return(MergeRows(leftRow, rightRow)); } } else if ((jointype & JoinType.Left) != 0) { FdoRow emptyRow = new FdoRow(); yield return(MergeRows(leftRow, emptyRow)); } else { LeftOrphanRow(leftRow); } } foreach (FdoRow rightRow in rightEnumerable) { if (rightRowsWereMatched.ContainsKey(rightRow)) { continue; } FdoRow emptyRow = new FdoRow(); if ((jointype & JoinType.Right) != 0) { yield return(MergeRows(emptyRow, rightRow)); } else { RightOrphanRow(rightRow); } } }
private FdoRow ConvertValues(FdoRow row) { foreach (string propertyName in _rules.Keys) { if (row[propertyName] != null) { FdoDataPropertyConversionRule rule = _rules[propertyName]; LiteralValue old = ValueConverter.GetConvertedValue(row[propertyName]); if (old.LiteralValueType == LiteralValueType.LiteralValueType_Data) { DataValue converted = ValueConverter.ConvertDataValue((DataValue)old, rule.TargetDataType, rule.NullOnFailure, rule.Truncate); row[propertyName] = ValueConverter.GetClrValue(converted); converted.Dispose(); old.Dispose(); } } } return(row); }
private FdoRow ConvertValues(FdoRow row) { foreach(string propertyName in _rules.Keys) { if (row[propertyName] != null) { FdoDataPropertyConversionRule rule = _rules[propertyName]; LiteralValue old = ValueConverter.GetConvertedValue(row[propertyName]); if (old.LiteralValueType == LiteralValueType.LiteralValueType_Data) { DataValue converted = ValueConverter.ConvertDataValue((DataValue)old, rule.TargetDataType, rule.NullOnFailure, rule.Truncate); row[propertyName] = ValueConverter.GetClrValue(converted); converted.Dispose(); old.Dispose(); } } } return row; }
private FdoRow Flatten(FdoRow row) { //Not applicable? if (row.Geometry == null) return row; //Already 2D? Move along! if (FdoGeometryUtil.Is2D(row.Geometry)) return row; IGeometry geom = row.Geometry; IGeometry trans = FdoGeometryUtil.Flatten(geom, _geomFactory); //Dispose the original if flatten returned a new instance if (!IGeometry.ReferenceEquals(geom, trans)) { row.Geometry = trans; geom.Dispose(); } return row; }
private FdoRow MakeWkbCompliant(FdoRow row) { //Not applicable? if (row.Geometry == null) return row; //Already 2D? Move along! //if (FdoGeometryUtil.Is2D(row.Geometry)) // return row; IGeometry geom = row.Geometry; IGeometry trans = FdoGeometryUtil.ForceWkb(geom, _geomFactory); //Dispose the original if ForceWkb returned a new instance if (!IGeometry.ReferenceEquals(geom, trans)) { row.Geometry = trans; geom.Dispose(); } return row; }
private void PrepareSqlTemplate(FdoRow obj) { _propertyTraversalList = new List <string>(); if (IsUsingPropertyMappings()) { List <string> columns = new List <string>(); foreach (string name in _mappings.Keys) { columns.Add(name); } _sqlTpl = "INSERT INTO " + GetTableName() + " (" + QUALIFIER_BEGIN + string.Join(QUALIFIER_END + ", " + QUALIFIER_BEGIN, columns.ToArray()); _sqlTpl += QUALIFIER_END + ") VALUES ("; List <string> fmtValues = new List <string>(); for (int i = 0; i < _mappings.Count; i++) { fmtValues.Add("{" + i + "}"); } _sqlTpl += string.Join(",", fmtValues.ToArray()) + ")"; } else { foreach (string name in obj.Keys) { _propertyTraversalList.Add(name); } _sqlTpl = "INSERT INTO " + GetTableName() + " (" + QUALIFIER_BEGIN + string.Join(QUALIFIER_END + ", " + QUALIFIER_BEGIN, _propertyTraversalList.ToArray()); _sqlTpl += QUALIFIER_END + ") VALUES ("; List <string> fmtValues = new List <string>(); for (int i = 0; i < _propertyTraversalList.Count; i++) { fmtValues.Add("{" + i + "}"); } _sqlTpl += string.Join(",", fmtValues.ToArray()) + ")"; } }
private FdoRow MakeWkbCompliant(FdoRow row) { //Not applicable? if (row.Geometry == null) { return(row); } //Already 2D? Move along! //if (FdoGeometryUtil.Is2D(row.Geometry)) // return row; IGeometry geom = row.Geometry; IGeometry trans = FdoGeometryUtil.ForceWkb(geom, _geomFactory); //Dispose the original if ForceWkb returned a new instance if (!IGeometry.ReferenceEquals(geom, trans)) { row.Geometry = trans; geom.Dispose(); } return(row); }
/// <summary> /// Merges the two rows into a single row /// </summary> /// <param name="leftRow">The left row.</param> /// <param name="rightRow">The right row.</param> /// <returns></returns> protected abstract FdoRow MergeRows(FdoRow leftRow, FdoRow rightRow);
/// <summary> /// Called when a row on the right side was filtered by /// the join condition, allow a derived class to perform /// logic associated to that, such as logging /// </summary> protected virtual void RightOrphanRow(FdoRow row) { }
/// <summary> /// Called when a row on the left side was filtered by /// the join condition, allow a derived class to perform /// logic associated to that, such as logging /// </summary> /// <param name="row">The row.</param> protected virtual void LeftOrphanRow(FdoRow row) { }
/// <summary> /// Called when a row is processed. /// </summary> /// <param name="op">The operation.</param> /// <param name="dictionary">The dictionary.</param> protected override void OnFeatureProcessed(FdoToolbox.Core.ETL.Operations.FdoOperationBase op, FdoRow dictionary) { //We want to avoid log chatter on specialized ETL processes so suppress the base call }
/// <summary> /// Raises the row processed event /// </summary> /// <param name="dictionary">The dictionary.</param> void IFdoOperation.RaiseFeatureProcessed(FdoRow dictionary) { Statistics.MarkFeatureProcessed(); // we don't have a real event here, so we ignore it // it will be handled by the children at any rate }
private FdoRow CreateRowFromReader(FdoFeatureReader reader) { return(FdoRow.FromFeatureReader(reader, ignoreProperties)); }
private ParameterValueCollection CreateParameterValues(string prefix, FdoRow row) { ParameterValueCollection values = new ParameterValueCollection(); if (_mappings == null || _mappings.Count == 0) { foreach (string col in row.Columns) { //No excluded properties or property not in exclusion list if (_unWritableProperties == null || _unWritableProperties.Count == 0 || !_unWritableProperties.Contains(col)) { //Omit null values if (row[col] != null && row[col] != DBNull.Value) { if (!row.IsGeometryProperty(col)) { LiteralValue dv = ValueConverter.GetConvertedValue(row[col]); if (dv != null) { ParameterValue pv = new ParameterValue(prefix + col, dv); values.Add(pv); } } else { IGeometry geom = row[col] as IGeometry; if (geom != null) { ParameterValue pv = new ParameterValue(prefix + col, new GeometryValue(FdoGeometryFactory.Instance.GetFgf(geom))); values.Add(pv); } } } } } } else { foreach (string col in row.Columns) { //No excluded properties or property not in exclusion list if (_unWritableProperties == null || _unWritableProperties.Count == 0 || !_unWritableProperties.Contains(col)) { //Omit null and un-mapped values if (_mappings[col] != null || row[col] != null && row[col] != DBNull.Value) { if (!row.IsGeometryProperty(col)) { LiteralValue dv = ValueConverter.GetConvertedValue(row[col]); if (dv != null) { ParameterValue pv = new ParameterValue(prefix + _mappings[col], dv); values.Add(pv); } } else { IGeometry geom = row[col] as IGeometry; if (geom != null) { ParameterValue pv = new ParameterValue(prefix + _mappings[col], new GeometryValue(FdoGeometryFactory.Instance.GetFgf(geom))); values.Add(pv); } } } } } } return(values); }
private void Bind(FdoRow row) { //Set all property values to null and then set the proper values foreach (string propName in currentValues.Keys) { //Get the [target] property name. If reverse-mapped to the [source], use the //mapped [source] property name. Otherwise it is assumed that [source] name //is the same as the [target] name string name = propName; if (_mappings[name] != null) { name = _mappings[name]; } LiteralValue lVal = currentValues[propName] as LiteralValue; if (lVal.LiteralValueType == LiteralValueType.LiteralValueType_Data) { DataValue dVal = lVal as DataValue; dVal.SetNull(); switch (dVal.DataType) { case DataType.DataType_BLOB: { byte [] blob = row[name] as byte[]; if (blob != null) { (dVal as BLOBValue).Data = blob; } } break; case DataType.DataType_Boolean: { if (row[name] != null) { (dVal as BooleanValue).Boolean = Convert.ToBoolean(row[name]); } } break; case DataType.DataType_Byte: { if (row[name] != null) { (dVal as ByteValue).Byte = Convert.ToByte(row[name]); } } break; case DataType.DataType_CLOB: { byte[] clob = row[name] as byte[]; if (clob != null) { (dVal as CLOBValue).Data = clob; } } break; case DataType.DataType_DateTime: { if (row[name] != null) { (dVal as DateTimeValue).DateTime = Convert.ToDateTime(row[name]); } } break; case DataType.DataType_Decimal: { if (row[name] != null) { (dVal as DecimalValue).Decimal = Convert.ToDouble(row[name]); } } break; case DataType.DataType_Double: { if (row[name] != null) { (dVal as DoubleValue).Double = Convert.ToDouble(row[name]); } } break; case DataType.DataType_Int16: { if (row[name] != null) { (dVal as Int16Value).Int16 = Convert.ToInt16(row[name]); } } break; case DataType.DataType_Int32: { if (row[name] != null) { (dVal as Int32Value).Int32 = Convert.ToInt32(row[name]); } } break; case DataType.DataType_Int64: { if (row[name] != null) { (dVal as Int64Value).Int64 = Convert.ToInt64(row[name]); } } break; case DataType.DataType_Single: { if (row[name] != null) { (dVal as SingleValue).Single = Convert.ToSingle(row[name]); } } break; case DataType.DataType_String: { if (row[name] != null) { (dVal as StringValue).String = row[name].ToString(); } } break; } } else { GeometryValue gVal = lVal as GeometryValue; gVal.SetNull(); IGeometry geom = row[name] as IGeometry; if (geom != null) { IGeometry origGeom = geom; //HACK: Just for you SQL Server 2008! if (geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_Polygon || geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_CurvePolygon || geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_MultiCurvePolygon || geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_MultiPolygon) { if (_conn.Provider.ToUpper().StartsWith("OSGEO.SQLSERVERSPATIAL")) { //This isn't the most optimal way, as the most optimal //method according to RFC48 is to get the source rule and //strictness and pass that to SpatialUtility.GetPolygonVertexOrderAction() //along with the target rule and strictness. I don't think warping the //existing API to address such a provider-specific corner case is worth it. var caps = _clsDef.Capabilities; var rule = caps.get_PolygonVertexOrderRule(name); geom = SpatialUtility.FixPolygonVertexOrder(origGeom, rule); } } if (geom != null) { gVal.Geometry = FdoGeometryFactory.Instance.GetFgf(geom); } else { gVal.Geometry = FdoGeometryFactory.Instance.GetFgf(origGeom); } } } } }
/// <summary> /// Raises the OnFeatureProcessed event /// </summary> /// <param name="row"></param> public void RaiseFeatureProcessed(FdoRow row) { Statistics.MarkFeatureProcessed(); OnFeatureProcessed(this, row); }
private string BuildSql(FdoRow obj) { if (IsUsingPropertyMappings()) { string[] values = new string[_mappings.Count]; int i = 0; foreach (string target in _mappings.Keys) { string name = _mappings[target]; if (obj[name] != null) { if (obj.IsGeometryProperty(name)) values[i] = VALUE_BEGIN + ((IGeometry)obj[name]).Text + VALUE_END; else if (obj[name].GetType() == typeof(string)) values[i] = VALUE_BEGIN + EscapeValue((string)obj[name]) + VALUE_END; else if (obj[name].GetType() == typeof(DateTime)) values[i] = VALUE_BEGIN + ((DateTime)obj[name]).ToString(ISO8601_FMT) + VALUE_END; else values[i] = VALUE_BEGIN + obj[name].ToString() + VALUE_END; } else { values[i] = GetNullValue(); } i++; } return string.Format(_sqlTpl, values); } else { string[] values = new string[_propertyTraversalList.Count]; for (int i = 0; i < values.Length; i++) { string name = _propertyTraversalList[i]; if (obj[name] != null) values[i] = VALUE_BEGIN + obj[name].ToString() + VALUE_END; else if (obj[name].GetType() == typeof(DateTime)) values[i] = VALUE_BEGIN + ((DateTime)obj[name]).ToString(ISO8601_FMT) + VALUE_END; else values[i] = GetNullValue(); } return string.Format(_sqlTpl, values); } }
private ParameterValueCollection CreateParameterValues(string prefix, FdoRow row) { ParameterValueCollection values = new ParameterValueCollection(); if (_mappings == null || _mappings.Count == 0) { foreach (string col in row.Columns) { //No excluded properties or property not in exclusion list if (_unWritableProperties == null || _unWritableProperties.Count == 0 || !_unWritableProperties.Contains(col)) { //Omit null values if (row[col] != null && row[col] != DBNull.Value) { if (!row.IsGeometryProperty(col)) { LiteralValue dv = ValueConverter.GetConvertedValue(row[col]); if (dv != null) { ParameterValue pv = new ParameterValue(prefix + col, dv); values.Add(pv); } } else { IGeometry geom = row[col] as IGeometry; if (geom != null) { ParameterValue pv = new ParameterValue(prefix + col, new GeometryValue(FdoGeometryFactory.Instance.GetFgf(geom))); values.Add(pv); } } } } } } else { foreach (string col in row.Columns) { //No excluded properties or property not in exclusion list if (_unWritableProperties == null || _unWritableProperties.Count == 0 || !_unWritableProperties.Contains(col)) { //Omit null and un-mapped values if (_mappings[col] != null || row[col] != null && row[col] != DBNull.Value) { if (!row.IsGeometryProperty(col)) { LiteralValue dv = ValueConverter.GetConvertedValue(row[col]); if (dv != null) { ParameterValue pv = new ParameterValue(prefix + _mappings[col], dv); values.Add(pv); } } else { IGeometry geom = row[col] as IGeometry; if (geom != null) { ParameterValue pv = new ParameterValue(prefix + _mappings[col], new GeometryValue(FdoGeometryFactory.Instance.GetFgf(geom))); values.Add(pv); } } } } } } return values; }
/// <summary> /// Called when [feature processed]. /// </summary> /// <param name="op">The op.</param> /// <param name="dictionary">The dictionary.</param> protected override void OnFeatureProcessed(FdoOperationBase op, FdoRow dictionary) { if (op.Statistics.OutputtedRows % this.ReportFrequency == 0) { if (op is FdoOutputOperation) { string className = (op as FdoOutputOperation).ClassName; SendMessageFormatted("[Join => {0}]: {1} features processed", className, op.Statistics.OutputtedRows); } } }
/// <summary> /// Raises the OnFeatureFailed event /// </summary> /// <param name="row"></param> /// <param name="ex"></param> public void RaiseFailedFeatureProcessed(FdoRow row, Exception ex) { Statistics.MarkFeatureFailed(); this.Error(ex, "Error encountered processing feature: {0}", row.ToString()); OnFeatureFailed(this, row, ex); }
/// <summary> /// Executes this operation /// </summary> /// <param name="ignored">Ignored rows</param> /// <returns></returns> public override IEnumerable<FdoRow> Execute(IEnumerable<FdoRow> ignored) { PrepareForJoin(); IEnumerable<FdoRow> rightEnumerable = GetRightEnumerable(); IEnumerable<FdoRow> execute = left.Execute(null); foreach (FdoRow leftRow in new EventRaisingEnumerator(left, execute)) { ObjectArrayKeys key = leftRow.CreateKey(leftColumns); List<FdoRow> rightRows; if (this.rightRowsByJoinKey.TryGetValue(key, out rightRows)) { foreach (FdoRow rightRow in rightRows) { rightRowsWereMatched[rightRow] = null; yield return MergeRows(leftRow, rightRow); } } else if ((jointype & JoinType.Left) != 0) { FdoRow emptyRow = new FdoRow(); yield return MergeRows(leftRow, emptyRow); } else { LeftOrphanRow(leftRow); } } foreach (FdoRow rightRow in rightEnumerable) { if (rightRowsWereMatched.ContainsKey(rightRow)) continue; FdoRow emptyRow = new FdoRow(); if ((jointype & JoinType.Right) != 0) yield return MergeRows(emptyRow, rightRow); else RightOrphanRow(rightRow); } }
private void PrepareSqlTemplate(FdoRow obj) { _propertyTraversalList = new List<string>(); if (IsUsingPropertyMappings()) { List<string> columns = new List<string>(); foreach (string name in _mappings.Keys) { columns.Add(name); } _sqlTpl = "INSERT INTO " + GetTableName() + " (" + QUALIFIER_BEGIN + string.Join(QUALIFIER_END + ", " + QUALIFIER_BEGIN, columns.ToArray()); _sqlTpl += QUALIFIER_END + ") VALUES ("; List<string> fmtValues = new List<string>(); for (int i = 0; i < _mappings.Count; i++) { fmtValues.Add("{" + i + "}"); } _sqlTpl += string.Join(",", fmtValues.ToArray()) + ")"; } else { foreach (string name in obj.Keys) { _propertyTraversalList.Add(name); } _sqlTpl = "INSERT INTO " + GetTableName() + " (" + QUALIFIER_BEGIN + string.Join (QUALIFIER_END + ", " + QUALIFIER_BEGIN, _propertyTraversalList.ToArray()); _sqlTpl += QUALIFIER_END + ") VALUES ("; List<string> fmtValues = new List<string>(); for (int i = 0; i < _propertyTraversalList.Count; i++) { fmtValues.Add("{" + i + "}"); } _sqlTpl += string.Join(",", fmtValues.ToArray()) + ")"; } }
private void Bind(FdoRow row) { //Set all property values to null and then set the proper values foreach (string propName in currentValues.Keys) { //Get the [target] property name. If reverse-mapped to the [source], use the //mapped [source] property name. Otherwise it is assumed that [source] name //is the same as the [target] name string name = propName; if (_mappings[name] != null) name = _mappings[name]; LiteralValue lVal = currentValues[propName] as LiteralValue; if (lVal.LiteralValueType == LiteralValueType.LiteralValueType_Data) { DataValue dVal = lVal as DataValue; dVal.SetNull(); switch (dVal.DataType) { case DataType.DataType_BLOB: { byte [] blob = row[name] as byte[]; if(blob != null) { (dVal as BLOBValue).Data = blob; } } break; case DataType.DataType_Boolean: { if (row[name] != null) { (dVal as BooleanValue).Boolean = Convert.ToBoolean(row[name]); } } break; case DataType.DataType_Byte: { if (row[name] != null) { (dVal as ByteValue).Byte = Convert.ToByte(row[name]); } } break; case DataType.DataType_CLOB: { byte[] clob = row[name] as byte[]; if (clob != null) { (dVal as CLOBValue).Data = clob; } } break; case DataType.DataType_DateTime: { if (row[name] != null) { (dVal as DateTimeValue).DateTime = Convert.ToDateTime(row[name]); } } break; case DataType.DataType_Decimal: { if (row[name] != null) { (dVal as DecimalValue).Decimal = Convert.ToDouble(row[name]); } } break; case DataType.DataType_Double: { if (row[name] != null) { (dVal as DoubleValue).Double = Convert.ToDouble(row[name]); } } break; case DataType.DataType_Int16: { if (row[name] != null) { (dVal as Int16Value).Int16 = Convert.ToInt16(row[name]); } } break; case DataType.DataType_Int32: { if (row[name] != null) { (dVal as Int32Value).Int32 = Convert.ToInt32(row[name]); } } break; case DataType.DataType_Int64: { if (row[name] != null) { (dVal as Int64Value).Int64 = Convert.ToInt64(row[name]); } } break; case DataType.DataType_Single: { if (row[name] != null) { (dVal as SingleValue).Single = Convert.ToSingle(row[name]); } } break; case DataType.DataType_String: { if (row[name] != null) { (dVal as StringValue).String = row[name].ToString(); } } break; } } else { GeometryValue gVal = lVal as GeometryValue; gVal.SetNull(); IGeometry geom = row[name] as IGeometry; if (geom != null) { IGeometry origGeom = geom; //HACK: Just for you SQL Server 2008! if (geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_Polygon || geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_CurvePolygon || geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_MultiCurvePolygon || geom.DerivedType == OSGeo.FDO.Common.GeometryType.GeometryType_MultiPolygon) { if (_conn.Provider.ToUpper().StartsWith("OSGEO.SQLSERVERSPATIAL")) { //This isn't the most optimal way, as the most optimal //method according to RFC48 is to get the source rule and //strictness and pass that to SpatialUtility.GetPolygonVertexOrderAction() //along with the target rule and strictness. I don't think warping the //existing API to address such a provider-specific corner case is worth it. var caps = _clsDef.Capabilities; var rule = caps.get_PolygonVertexOrderRule(name); geom = SpatialUtility.FixPolygonVertexOrder(origGeom, rule); } } if (geom != null) gVal.Geometry = FdoGeometryFactory.Instance.GetFgf(geom); else gVal.Geometry = FdoGeometryFactory.Instance.GetFgf(origGeom); } } } }