ThinkGeo.com    |     Documentation    |     Premium Support

How to save/retrieve/edit/ delete mixed da using SQL2008 FeatureLayer

 


 


Hi Yale,


 My present concern is how to save the polygon geometry and position together with some text attributes of this polygon-zone. For example, ZoneID: 100, Monitor Zone Speed, Exclusion Zone Type etc. How to save these attributes together with the polygon geometry position? What changes should be made to the following code?

  MsSql2008FeatureLayer layer1 = new MsSql2008FeatureLayer("[ConectionString]", "[TableName]", "IdColumn");

try


{


msSqlFeatureLayer.Open();


msSqlFeatureLayer.EditTools.BeginTransaction();


msSqlFeatureLayer.EditTools.Add(polygonShape);


TransactionResult result = msSqlFeatureLayer.EditTools.CommitTransaction();


}


finally


{


msSqlFeatureLayer.Close();


}



Can you show me the code for display the saved  polygon data  as well as the code for edit and delete the polygon data? Thanks a lot. Franklin





Franklin,


Thanks for your post and questions.
Following code snippet shows how to save some attributes as well as shape, it is very similar to the code you provided with using Feature instead of shape directly added.

 

Feature feature = new Feature(polygonShape);
feature.ColumnValues.Add("ZoneID", "100");
feature.ColumnValues.Add("Monitor Zone Speed", "100");
feature.ColumnValues.Add("Exclusion Zone Type", "AAAA");

MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer("[ConectionString]", "[TableName]", "IdColumn");
try
{
     msSqlFeatureLayer.Open();
     msSqlFeatureLayer.EditTools.BeginTransaction();
     msSqlFeatureLayer.EditTools.Add(feature);
     TransactionResult result = msSqlFeatureLayer.EditTools.CommitTransaction();
}
finally
{
     msSqlFeatureLayer.Close();
}


In the following post we have discussed how to display a saved polygon as well as to edit the polygon by adding it to the EditShapeLayer in the EditOverlay.
gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/8252/afv/topic/Default.aspx#20694
Following code snippet shows how to delete a feature by passing its id as its key:

MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer("[ConectionString]", "[TableName]", "IdColumn");
try
{
      msSqlFeatureLayer.Open();
      msSqlFeatureLayer.EditTools.BeginTransaction();
      msSqlFeatureLayer.EditTools.Delete(feature.Id);
      TransactionResult result = msSqlFeatureLayer.EditTools.CommitTransaction();
}
finally
{
      msSqlFeatureLayer.Close();
}

 
Any more questions please feel free to let me know.
Thanks.
Yale

 



Yale, 
    
  Thanks a lot for the guidance. Yes, we did discuss how to make a polygon editable after loading it from memory. 
 What I was really asking yesterday is how to persist the edited polygon data by using Map Suite API, the polygon is within the database before editing. Sorry I didn’t raise the question clearly. Could you give some code for doing that?  
 I’m most obliged to your help. 
 Thanks. 
  
 Franklin 


Yale, 
   
  Tried out the Polygon save code above. I got stuck at " msSqlFeatureLayer.Open();" the error message is "no geometry column can be found". 
 The code is as follows: 
  
  
 PolygonShape polygonShape = (PolygonShape)e.TrackShape; 
            Feature feature = new Feature(polygonShape); 
            feature.ColumnValues.Add("ZoneID", "100"); 
            feature.ColumnValues.Add("FleetID", "88"); 
            feature.ColumnValues.Add("ZoneName", "AAAA"); 
            feature.ColumnValues.Add("IsBackendZone", "1"); 
            feature.ColumnValues.Add("Shape", "polygonShape");  // The db table has a Shape column with data type "tinyint", this is supposed to be  
                                                                                                     // the geometry column, right? But something is wrong here, i believe. 
            // SQL save method 
            MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer("server=(local);database=TestMapSuite;Integrated Security=SSPI;", "dbo.ZoneInfo", "IdColumn"); 
  
        //   MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer(); 
            try 
            { 
                msSqlFeatureLayer.Open(); 
                msSqlFeatureLayer.EditTools.BeginTransaction(); 
                msSqlFeatureLayer.EditTools.Add(feature); 
                TransactionResult result = msSqlFeatureLayer.EditTools.CommitTransaction(); 
            } 
            finally 
            { 
                msSqlFeatureLayer.Close(); 
            }  
  
 Could you please also comment on my first reply today? Thanks a lot. 
 Franklin

Franklin,


Try using the following API to get the features out from the SQL2008 table. While to make it work, we probably need to fix the Open issue addressed below first.
Collection<Feature> allFeaturesInSqlTable = msSqlFeatureLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns); 
 
Any more questions please feel free to let me know.
Thanks.
Yang

Franklin,


The error throwing out when calling the Open API for the MsSqlFeatureLayer indicates the Geometry or Geography column is not found in the SQL table. Can you double check the data in your table to make sure a column which type is Geometry or Geography with bytes or data to reflect the shape exists?
Can you give me some ideas how the data imported into the SQL server to make a better understanding of the problem?
Any more questions please feel free to let me know.
Thanks.
Yale

Yale, 
  
 1.)  Are you saying that there must be a column named “Geometry” or “Geography” built within the table for avoiding the “not found” problem? 
  
 I renamed the “Shape” column as “Geometry” but the same problem exists. What data type should be adopted for the “Geometry” column? I assume it is “tineyint”, but doesn’t seem appropriate. 
  
 2.) Once the shape data can be saved into the SQL2008 table, the following code, as you mentioned , can be used to fetch the shape out of database: 
 Collection<Feature> allFeaturesInSqlTable = msSqlFeatureLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);  
  
 My question here is: what other API should be called to display the polygon and its attributes? 
  
  
    

Yale, 
  
    This is a continuation of the most recent reply posted above. 
  
 3.) I wonder if the statement below: 
 Collection<Feature> allFeaturesInSqlTable = msSqlFeatureLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns); 
  is sufficient to retrieve a specific polygon data from the table, given that several polygons can be saved in the table? 
 How would you ensure that the specific polygon data is retrieved and nothing else? 
  
 Thanks a lot for the enlightening.     
  
 Franklin

Franklin,


Thanks for your post and feedback.
1)      I guess you do not set the correct data type for your shape column.  Are you using the SQL server 2008 instead of SQL server 2005? If yes, just take a look at the following documentations talking about the Geometry and Geography.
jasonfollas.com/blog/archive...art-1.aspx
weblogs.asp.net/jimjackson/a...blems.aspx
      If you still have problem, could you get some screenshot showing the data types for your table?
2)      Normally we use the Layer(MsSQL2008FetureLayer or InmemoryFeatureLayer) to show the features, we need to set the AreaStyle for it to indicate the way to draw the polygons.
3)      The API GetAllFeatures is to get out all the features in the table instead of retrieving one, if you want, you can use GetFeatureById to retrieve one specified ID feature.
Any more questions please feel free to let me know.
Thanks.
Yale

Yale, 



I set the "Geometry" column data type to "geometry" at the table design screen. Same problem remains. However still have doubts about using " feature.ColumnValues.Add("Geometry", "polygonShape");" Somehow this doesn't seem right? The whole piece of code is as follows: 



void trackOverlay_TrackEnded(object sender, TrackEndedTrackInteractiveOverlayEventArgs e) 



PolygonShape polygonShape = (PolygonShape)e.TrackShape; 

Feature feature = new Feature(polygonShape); 

feature.ColumnValues.Add("ZoneID", "100"); 

feature.ColumnValues.Add("FleetID", "88"); 

feature.ColumnValues.Add("ZoneName", "AAAA"); 

feature.ColumnValues.Add("IsBackendZone", "1"); 

feature.ColumnValues.Add("Geometry","polygonShape"); 



// feature.ColumnValues.Add("Shape", "polygonShape"); 



// SQL save method 

MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer("server=(local);database=TestMapSuite;Integrated Security=SSPI;", "dbo.ZoneInfo", "ZoneID"); 



// MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer();




try 



msSqlFeatureLayer.Open(); 

msSqlFeatureLayer.EditTools.BeginTransaction(); 

msSqlFeatureLayer.EditTools.Add(feature); 

TransactionResult result = msSqlFeatureLayer.EditTools.CommitTransaction(); 



finally 



msSqlFeatureLayer.Close(); 







I am concerned with the syntax in MsSql2008FeatureLayer msSqlFeatureLayer = new MsSql2008FeatureLayer("server=(local);database=TestMapSuite;Integrated Security=SSPI;", "dbo.ZoneInfo", "ZoneID"); 



Not Sure whether "ZoneID" should be placed there or not, in view of "IdColumn". I am seeking for your expert opinion on this issue. Have managed to send the data table design shot via ThinkGeo Customer Portal

Ticket #: 3087



Thanks.




Franklin



Franklin, 
  
 Thanks for your post and feedback. 
  
 Just curious how your data was imported? I know we can import the shape file into SQL server 2008 with the help of the ShapeToSQL tool, see following post: 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/4903/afv/topic/Default.aspx 
  
 Also, the following post show some way to import code with MapSuite APIs: 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/11/aft/6887/afv/topic/Default.aspx 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Franklin,  
  
 I checked Ticket 3078 and did not see an screenshot of your datatable attached. Could you perhaps try to add this a second time so that we might have an idea as to your data structure?

Yale, 
     As you know, my purpose of using the MsSql2008FeatureLayer method above is to save the polygon shape at the moment of TrackEnd. This doesn’t seem working at present. Could you please point out what really went wrong in the code? I have submitted the database table screen shot in Ticket 3087 just now. I am studying the posts recommended. Thanks very much for your help. 
  
 Regards, 
  
 Franklin

Thanks, Ryan. Have submitted the screen shot again via Ticket 3087. 
  
 Franklin

Hi Yale, 
  
   I might have misunderstood the capability of WPF Map Suite 4.0 Desktop. Does the trial version downloaded already provide the API for directly saving a new (or editted) polygon geometry into a SQL Database table? Can you give me a simple SQL example to show how the API deals with the saving of a polygon which is either newly created on the screen or just modified on the screen?  
 I am not trying to transfer the shp file polygon data into the database table. But rather try to find a SQL method based on the exisitng 4.0 API to persist the polygon data and retrieve/display them independently. Now it seems that all the hints point to that the API is not yet instrumental to my purpose. 
 May I know when the WPF Map Suite Desktop will be ready to provide such an API?  
 Thanks. 
 Franklin 
  
  


Franklin, 
  
 Thanks for your post and feedback. 
  
 The WPF MapSuite Desktop is exactly the same with other products in saving shapes, I have replied to you to following steps to verify the SQL environment and the SQL statement when calling the Open API in the ticket. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Yale, 
  
     Now that you have my code and the database table, is it convenient to execute the scenario in your environment thus verifying directly whether the present API can achieve the goal of persisting the polygon data into the SQL table immediately after the polygon drawing is completed on the screen? The web links shown in the ticket reply are concerned with different scenarios which have nothing to do with saving the screen polygon geometry and text data into a SQL table at the moment the polygon drawing is completed. When the API  4.0 was developed, did the design take into account the scenario jsut mentioned? 
  
 Franklin 
   
  


Franklin. 
  
 Thanks for your post and response. 
  
 I am sure we can save the tracked shapes into the SQL table because I have done very similar sample some months ago, I will try to create an available environment for this sample as soon as possible.  
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Hi Yale, 
  
    It is encouraging to know that you did similar sample before. Do you still have the code? I would like to have a comparison with mine. 
 Thanks for trying it out once more. 
  
 Franklin

Franklin,


Thanks for your post and understanding.


I did a thoughtful search on my previous job and found following post shows the code to save features into the SQL table, also there is another similar ticket about this topic showing the success to save features into SQL table using the MapSuite API. Recently, we are preparing for the next public release, so it might take more time to prepare the SQL environment, sorry for the inconvenience for now.
gis.thinkgeo.com/Support/Dis...fault.aspx
Any more questions please feel free to let me know.
Thanks.
Yale