ThinkGeo.com    |     Documentation    |     Premium Support

MsSql2008FeatureLayer. Some questuon (speed, transactions)

Hello, ThinkGeo Team!


Today I decided to torment you some questions about MsSql2008FeatureLayer. =)


Questions:


1) Why do so many requests going to the database? I have included MS SQL profiler and wondered why so many different requests goes to the database. Layer generates a query for each tile? The result is still quite a lot of requests, which are supposed to be combined into one.




2) How to use transactional?For example if I delete a set of objects at once?


________________________


Collection<feature> c_f =  this.sql2008Layer.QueryTools.GetFeaturesIntersecting(this.wpfMap1.CurrentExtent,  ReturningColumnsType.AllColumns);

            this.sql2008Layer.EditTools.BeginTransaction();

            foreach (var item in c_f)

            {

                this.sql2008Layer.EditTools.Delete(item.Id);

            }

            this.sql2008Layer.EditTools.CommitTransaction();</feature>


________________________




But in this situation it only removes the first item in the list and as a result of improperly constructing a database query. If I write


________________________


Collection<feature> c_f = this.sql2008Layer.QueryTools.GetFeaturesIntersecting(this.wpfMap1.CurrentExtent, ReturningColumnsType.AllColumns);

            foreach (var item in c_f)

            {

                this.sql2008Layer.EditTools.BeginTransaction();

                this.sql2008Layer.EditTools.Delete(item.Id);

                this.sql2008Layer.EditTools.CommitTransaction();

            }</feature>


________________________




In this case it works, but in this case, I get many requests to the database as the number of deleted objects, that is not quite logical, because if I want in a single transaction to delete these objects? And in most cases generated by the query again, may be the only one. What am I doing wrong?



My code below:


  private void button1_Click(object sender, RoutedEventArgs e)

            {

                string connectString = @"Data Source=RND-137\DENALI;Initial Catalog=2GIS_TEST;Persist Security Info=True;Integrated Security=True;";

                this.sql2008Layer = new MsSql2008FeatureLayer(connectString, "msk_house_test", "geom", 4326);

                this.sql2008Layer.FeatureIdColumn = "ID";

               

                this.sql2008Layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.SimpleColors.Red;

                this.sql2008Layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;



                LayerOverlay sql2008Overlay = new LayerOverlay();

                sql2008Overlay.Layers.Add("Sql2008Layer", this.sql2008Layer);

                sql2008Overlay.RenderMode = RenderMode.DrawingVisual;

                wpfMap1.Overlays.Add("Sql2008Overlay", sql2008Overlay);

            }



            private void button2_Click(object sender, RoutedEventArgs e)

            {

                this.sql2008Layer.Open();



                Collection<Feature> c_f = this.sql2008Layer.QueryTools.GetFeaturesIntersecting(this.wpfMap1.CurrentExtent, ReturningColumnsType.AllColumns);

                foreach (var item in c_f)

                {

                    this.sql2008Layer.EditTools.BeginTransaction();

                    this.sql2008Layer.EditTools.Delete(item.Id);

                    this.sql2008Layer.EditTools.CommitTransaction();

                }



                this.wpfMap1.Refresh();

            }



 


 


 


 



up!

Hi Alex, 
  
 Thanks for your up :) 
  
 For your question 1, we generate requests in each tile, so it will have many requests. I think you can try to overwrite drawcore for combine into one request. But I think that should be not easy and we don’t have implement for that before. 
  
 For your question 2, I am trying to reproduce your situation local, if your code one only delete one item, that should be a bug. 
  
 BTW, are your using our latest version? 
  
 Regards, 
  
 Don

Thank you for your post, Don.  
 On the first question is clear, Thanks :) 
 And what about the second question on the contrary did not understand. Yes, I have the latest version of your library (5.5.0.49). To be honest, I do not quite understand your answer to question 2). So where as a result of a mistake?  
  
 I will try to formulate the question differently: can I somehow in a single transaction to add or delete multiple (5 or 100 or some more) elements using MsSql2008FeatureLayer? If you could show an example of code that would be great! The code  
  
             this.sql2008Layer.EditTools.BeginTransaction(); 
             foreach (var item in c_f) 
             { 
                 this.sql2008Layer.EditTools.Delete(item.Id); 
             } 
             this.sql2008Layer.EditTools.CommitTransaction(); 
  
 This code works properly (or I want the wrong way to solve my problem) :) 
  
 Thanks.

Thank you for your post, Don.  
 On the first question is clear, Thanks :) 
 And what about the second question on the contrary did not understand. Yes, I have the latest version of your library (5.5.0.49). To be honest, I do not quite understand your answer to question 2). So where as a result of a mistake?  
  
 I will try to formulate the question differently: can I somehow in a single transaction to add or delete multiple (5 or 100 or some more) elements using MsSql2008FeatureLayer? If you could show an example of code that would be great! The code  
  
             this.sql2008Layer.EditTools.BeginTransaction(); 
             foreach (var item in c_f) 
             { 
                 this.sql2008Layer.EditTools.Delete(item.Id); 
             } 
             this.sql2008Layer.EditTools.CommitTransaction(); 
  
 This code works properly (or I want the wrong way to solve my problem) :) 
  
 Thanks.

Sorry for the duplication of posts…

Alex, 
  
 Don’t worry about that, I have deleted your duplication reply. 
  
 I think maybe I have misunderstand with your question in your fist post, I thought if you delete item like this: 
  
 this.sql2008Layer.EditTools.BeginTransaction();  
 foreach (var item in c_f)  
 {  
 this.sql2008Layer.EditTools.Delete(item.Id);  
 }  
 this.sql2008Layer.EditTools.CommitTransaction();  
  
 Only the first item deleted in database, if so, that should be a bug. 
  
 In your last reply, it looks you don’t want to sent multiply requests to database for delete items. 
  
 I review the code of MsSql2008FeatureSource and it looks if we delete many features, we only sent one request for that, we create one delete command and it contains all feature id which had been deleted in featureLayer, so it should be a single transaction.  
  
 Regards, 
  
 Don

Hi, Don! There was an interesting thing, on a previous version (probably 5.5.0.0) I have a layer of working as I wrote in my first post. On another computer, downloaded the latest version 5.5.0.49 installed there and there on the same project is working correctly. I’m sorry, that was originally introduced in error, a bit confused, it turns out was an older version 5.5.0.0. 
 I would like to know this was corrected, or just something I somewhere I doing wrong? Thanks in advance. :) 
  
 P.S. Now version 5.5.0.49 (exactly) all works well.

I copied the library files (older version), and connected to the project, yes, it requests are incorrect. In the latter all is well. Thank you for the solution of the problem in the new version!

 Alex,


I'm glad Don's solution fixed your problem.  Please let us know if you have any other questions.


Thanks!