ThinkGeo.com    |     Documentation    |     Premium Support

Add new feature to SQL Server via MapSuite

Good morning,


I'm writing a little experimental code to use the EditOverlay and a road feature SQL Server table to split a road at the point where the user adds a new vertex.  (I'm using LineOnALine to get two new LineShapes, but that might not be important right now.)  In one transaction, I'm trying to delete the old feature (I'd really like to update it, but haven't quite gotten that far) and add the two new features (the old line split into two new features).   When I do this:



 



MsSql2008FeatureLayer layer = (MsSql2008FeatureLayer)winformsMap1.FindFeatureLayer("Highways");

...the feature I want to delete is being deleted, but the two new features are never added to the table.  No errors, just no new records.  I refresh the map and the original feature is gone but the two new ones are not.  (If I do a COUNT(*) query before and after, the number decreases by 1 due to the deleted record, but should be increasing by 1 because I deleted 1 row and added two.)   I have never added features through MapSuite before; we've always done it in code right to SQL Server.  Anyone have any thoughts on why my records aren't being added?  I thought perhaps a GID issue, but SQL Server will generate that, and then I thought perhaps an SRID issue I'd think the record would still be added to the table.


Thanks,


Allen



layer.FeatureSource.Open();


layer.FeatureSource.BeginTransaction();


layer.FeatureSource.DeleteFeature(args.AffectedVertexFeature.Id);


layer.FeatureSource.AddFeature(newFeature1);


layer.FeatureSource.AddFeature(newFeature2);


layer.FeatureSource.CommitTransaction();


layer.FeatureSource.Close();



Allen, 



Thanks for your post, I have tested the delete and added features functions for MsSql2008FeatureLayer, they both work fine, so please test your application according to my steps again: 



1, Comment the delete feature code, just run the add features code, 



2, If the features cannot be added to your table correctly, so we can determine the problem is not from the delete function before you add the features. 



So please send the feature structures what you try to add to us, we guessed the problem is from the features, they are not the correct feature, 



Thanks, 



Scott,



Good morning Scott, 
  
 I will try removing the Delete and report back as soon as I get a few minutes.  I’m wondering myself if it’s the attributes.  I have checked the SQL Server error log and don’t see anything there, so I’m guessing the Adds are not getting that far.  The SQL table has four float columns.  I am simply pulling the column names and values out of the existing feature and adding them to the new features, and of course since Feature.ColumnValues  is  a Dictionary<string, string> so I wonder if something is going wrong there with the float numeric values.  I think I have a similar layer that does not have any float columns I can check this on.  That might help isolate things. 
  
 Thanks, 
 Allen 
  


Scott, 
  
 Here’s an update. 
  
 I have removed everything but a single AddFeature to the transaction.  I switched to a table that has no float columns.  This is a hydro line table with just four columns: 
  
 GID (Primary key, int, not null) 
 GEOM (Geometry, not null) 
 NAME (Nvarchar(130), not null) 
 MTFCC (nvarchar(10), not null) 
  
 The record is still not being written to the table.  The feature I’m trying to write contains only values for NAME and MTFCC.  I presume MapSuite is dealing with the geometry since it’s getting a Feature, and that SQL Server will be creating a new GID, so the feature I’m trying to write has just two columns.  Any more ideas?  I’ll keep tinkering. 
  
 Allen

I may have figured this out.  I discovered that CommitTransaction returns status information.  The error message was something like "cannot convert “XXX-XXX-XXX-XXX” to int.  The only int column in the table is the GID, so this was very strange.  It turns out the tool that uploads the data to SQL Server does not make the GID field IDENTITY, and I presume under the covers MapSuite sees this and is trying to convert its own internal ID to the GID for the table.  Once I can rebuild this table with IDENTITY on the GID, I’m guessing things will work.  I’ll report back.

Yes, that was it.  I rebuilt the table with GID as IDENTITY, and everything’s working as expected.  The delete and two adds are all being processed in the same transaction.  The only thing I had to do was to filter out the GID column when copying the attributes from the original to the two new features since it is now being incremented by SQL Server.  Whew.

Allen,


I checked the core code for the MsSql2008FeatureLayer and we found out there is a simple way can help you add the features more easily, you don't need to filter out the GID column before you add new features, you just need to set the GID column value to the Id property value of the new feature and insert the new feature to your table if you don't want to use the GID as IDENTITY. 

 


Here is the code can help you understand it better and you can use it in your sample application directly:



int GID = 12345;
            Feature feature = new Feature(multiPolygon.GetWellKnownBinary(), GID.ToString());
            feature.ColumnValues.Add("GID", string.Empty);
            feature.ColumnValues.Add("NAME", "Test");
            feature.ColumnValues.Add("MTFCC", "A10");
            sql2008Layer.FeatureSource.AddFeature(feature);
Thanks,


Scott,



Scott, 
  
 Last night I actually expected I could do something like this and, in fact, I hard-coded a GID of “500000” into the GID column of the new feature and it worked.  Ultimately our data will be using SQL Server replication to keep customers updated, so I really want to let SQL Server go about the business of creating the GID because it’s so vital in replication.  Filtering out the GID column from the original feature is only one line of code. 
  
 Anyway, I showed the results to the boss and he was satisfied we could do this, so I think that’s the end of the experiment until we define more editing tools.   
  
 Thanks for your assistance, 
 Allen

Allen, 
  
 You are welcome, that’s great to hear you that your solution can work fine now, if you still have any other questions please let us know again, 
  
 Thanks, 
  
 Scott,