ThinkGeo.com    |     Documentation    |     Premium Support

MsSql2008FeatureLayer Object Reference Error

Hello,


I'm considering using a spatial database instead of shape files and I'm using Map Suite Web Edition 3.1.16 + VS 2008 SP1 + .NET Framework 3.5 SP 1 + MS SQL Server 2008 Enterprise on Vista Enterprise SP 1.


I've imported a basic shape file into MS Sql 2008 using Shape2SQL v1.2.3374.18142 (sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx). Import went OK and I can query the data using the Management Studio.


I've created a simple test project but, I get 'Object reference not set to an instance of an object'.


Then, I imported cntry02.shp from the sample data and modified the sample project to reach that data (LoadAMSSQL2008FeatureLayer.aspx.cs).


I still observe the error. I've found a few references to this error in the forums, but nothing conclusive.


Can you help ?


Thanks, Hakan.



Hi Hakan,



We can’t create your issue with the latest version of “SqlSpatial Query Tool v1.2.3374.19142” (v1.2.3374.18142 can’t be downloaded from the website you provide), 



We guess there are two things may cause your issue:



1.    The data table name is incorrect in the constructor of MsSql2008FeatureLayer, please check the second parameter of the constructor (“cntry02” in the following code) and  make sure it exists,




MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(connectString, "cntry02", "id");




2.    The geometry data column is not stored in the database; please make sure the column which contains the geometry data is with the type of Geometry.



If it’s not the reason I mentioned above, please upgrade the tool to the latest version and have a try. Here is the sample code using data imported from cntry02.shp.




string connectString = "Data Source=serverName;Initial Catalog=test1;Persist Security Info=True;User ID=userid;Password=ps";
            MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(connectString, "cntry02", "id");
            sql2008Layer.Open();
            sql2008Layer.MakeAllGeometriesValid();
            sql2008Layer.Close();
            sql2008Layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            sql2008Layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            Map1.StaticOverlay.Layers.Add("Sql2008Layer", sql2008Layer);







Sorry for the inconvenience, we’ll improve our exception message in the next version. 



Any questions, please let us know,



Thanks,



Howard



Hello Howard,


I actually found the "bug", it was a letter capitalization problem. I have the locale set as Turkish and in Turkish there are two types of letter 'I' and one has a dot and other has not. Replacing "id" with "ID" solved the problem.


On the other hand I have some other questions regarding the sql layer :


1) How to set up and use spatial indices ?

2) Do you have speed comparison information with ShapeFile layers ?

3) Some sort of best practices information for sql layer would be very appreciated.


Regards,


Hakan.



Hakan, 



Here are the answers: 



1). There’re 2 ways to build index: 

i. Use the MsSql2008FeatureLayer.BuildIndex function to build index. 

ii. Execute the following SQL-Statement: CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1 ON SpatialTable(geometry_col) WITH (BOUNDING_BOX = (minX,minY,maxX,maxY) ); 

You can visit this web site: msdn.microsoft.com/en-us/library/bb934196.aspx for details

The spatial index will be used automatically in MsSql2008FeatureLayer. 



2) I test the performance of MsSql2008FeatureLayer and ShapeFileFeatureLayer, following is the test result: 

Record count in specify extent      MsSql2008FeatureLayer(s)         ShapeFileFeatureLayer(s)

64,924                                                8.11                                                  3.45  

20,078                                                2.62                                                  1.27  

2,533                                                  0.42                                                   0.24  

You can see the MsSql2008FeatureLayer's performance is around 50% of ShapeFileFeatureLayer. 



3) I'm not sure about the "best practice", there are a couple of tricks though you might know already. 

a. Specify the right Srid property by using MsSql2008FeatureLayer.Srid. 

b. When building index by executing SQL-Statement, specify the BOUNDING_BOX by the value that get from MsSql2008FeatureLayer.GetBoundingBox(). 



Any question please let me know. 



Thanks, 



Ben



Hello Ben,


Thank you for the information.


Regards,


Hakan



You are always welcome, Hakan. 
  
 Ben.