ThinkGeo.com    |     Documentation    |     Premium Support

Could not lock table error when using QueryTools.ExecuteQuery

I apologize if this has been explained in another topic - I searched all morning and couldn't find anything.


I am getting an exception "OleDbException was unhandled - Could not lock table "IN039lkA'; currently in use by user '(unknown)' on machine '(unknown)'.


I am trying to run a SQL query against a shapefile so I can use the LIKE function. The GetFeaturesByColumnValue is case sensitive which doesn't provide a user-friendly experience for our target users. We are using the 2006 USA maps by county from ThinkGeo, and in this example I am using the Elkhart county files - specifically IN039lkA which is the street shapefile.


What I am trying to accomplish is getting a specific value from a column that is like the user input, so I can get the shapefile's flavor of case for that value. From there I will be using the GetFeaturesByColumnValue to get the specific features I desire. I know that I can use GetAllFeatures and query that collection using .Contains but it is slow even on my 2.8Ghz Core2Duo with 4GB ram - specs far and above my users. This implementation will be on laptops in the field.


This is a proof-of-concept application outside of my actual project. I can provide source to the form if necessary (it currently has some commented code from a lot of testing).


I will try to explain my current test attempts:



        
  • I am on form load calling a method to setup my map. I have 2 layers for the streets, using 2 different indexes so I can use different line styles based on road type.

  •     
  • I have a separate method that is run, based on user input, to use a modified implementation of the Code Project for finding a street intersection for that purpose.

  •     
  • The FENAME for streets in the USA map data is in the format of "County Road 17" or "Suburban" which is causing the issue of making the user input information in the correct case.

  •     
  • In the method I have tried to create a shapefile layer that uses the original 'full' index so I have all road features with which to work. I open the file and CanExecuteQuery returns true, but I receive the above error.

  •     
  • I have tried to make the shapefile as private class variable and while it works for the map display, it still gives me the error with the query... If it is only opened in one place how can I have that lock issue - especially when I am selecting data only?

  •     
  • I am not familiar with DataTable so my issue in figuring out how to get the data back out is separate (but any help is appreciated).


I'm really at a loss. I am new to the ThinkGeo components but they are very straightforward to use. I like them quite a bit. Any help you can provide is great. It would be nice for an option to have a case-insensitive search for GetFeaturesByColumnValue.


Thanks.


Edit: By the way, the Query works fine in MapExplorer: "Select FENAME From IN039lkA Where FENAME Like('%SUBURBAN%');"



I have found that if I run the query in the same method that initially creates the ShapeFileFeatureLayer for the map, it works just fine without error - and that is testing with a layer for the original index, highways only, and secondary only, all active at the same time. There must be some way I can access the QueryTools on a layer in the map control from another method in the same form.

I think that it would be ideal if you could send us the your actual project with the code. That way we can go directly to resolving your problem instead of spending time setting up your scenario and trying to recreate the error on our side. If you don’t fell confortable sending your project in the Discussion Forum, you can use one of your Support tickets in the Customer Portal.  
  I think that having an API for GetFeaturesByColumnValue that is case insensitive is a good idea. I added this idea to our Issue Tracker for the development team to consider it to be added to Map Suite. Thank you for your suggestion.

Thanks!


 This is the form I am working on. It should be functional on its own. It currently is using Desktop Edition, Core, and Geocode components. The only files it looks at are USA 2006 map data files (I already built the indexes) and 2 simple icons from the evaluation downloads (for convenience). 


I have commented the code as best I could to help explain what I was trying/thinking. The current active code exhibits the problem. There is working code as well that is commented at this time (but limited to exact matches).


The page works by typing in data and pressing enter in the text field. If an address, it will geocode the data. If an intersection, notated by the form Street1 & Street2, it will indicate the intersection with a red dot (or more if there are multiple matches in the county). The confirm button has no use for this page as it sits right now. Please let me know if you have any questions.


 



1654-VerifyMap.zip (11.2 KB)

David, 
  
 We can not test the sample so far because it can not compile that we can find the definition of some Type, such as Address, MarkerLayer etc. 
  
 Could you provide the entire sample code or remove the types that can compile? 
  
 And we will work on it still, try to comment out some code and make it compile, if we recreate your problem I will let you know. 
  
 Thanks 
  
 James  


I am very sorry and apologize!


Attached is the entire solution. The program.cs is set to launch the VerifyMap form. There is no map data included in the sample. I just tested this and it worked fine. Again, I built the indexes separately from this program. The IN039Highway.idx is CFCC, A[1][0-9], IN039Secondary.idx is CFCC, A[2-3][0-9], and IN039LocalRoad.idx is CFCC, A[4-9][0-9]. All others are a standard index file for that shapefile. I am also having an issue with the extent for the map. When I use the Lake County, IN information using the BoundingBox of the county layer it works fine, but the same method on the Elkhart County, IN data does not 'zoom in' on the county in the same way.


Thank you for all your help. You have all be very helpful.



1662-ThinkGeoGIS_PoC.zip (91.5 KB)

I did figure out the issue with the CurrentExtent. I had zoom level snapping on and that was causing the problem. I set it to none and it worked. I still haven’t figured out the problem with the QueryTools but am still looking.

I have your solution opened with the references that you need for Map Suite such as DesktopEdition, MapSuiteCore, MapSuiteGeocoder, NetTopologySuite. But, I still have a reference problem. I have the error “The type or namespace name ‘MatchItem’ could not be found (are you missing a using directive or an assembly reference?)”. What is that MatchItem object, what reference do I need for that or where is its definition?

That is part of Geocoder I beleive. When I go to definition it brings up  namespace ThinkGeo.MapSuite.MapSuiteGeocoder, public class is MatchItem


 



 



 


David,
 
Right now, the sample project can compile, but we still can not test because of lacking of data, we need the shape files that can show the exception be thrown when you do the spatial query, I have reviewed the code, I think there is no incorrect usage in it. So could you provide the data as well?
If you don’t fell comfortable sending your private data in the Discussion Forum, you can send it to support@thinkgeo.com, and let him forward to James.
 
I am sure if we can recreate your problem, we would give your some solution to solve it. 
 
Thanks
James

James,


I am attaching the data. Due to size, I have compressed it with 7zip in 2 files (max attach file size is 500kb) and then placed in a Zip file (can't attach 7z). All files were in the same folder. The data is from the ThinkGeo USA 2006 Map Data with 3 custom indexes for the IN039lkA.shp road layer.


Thanks,


David



1670-Elkhart-Set1.zip (394 KB)
1671-Elkhart-Set2.zip (387 KB)

 


David,
 
Now, I got the data and I can test, from the comment of your sample, I found the code that it will throw exception when you use QueryTools.
 
Do you mean this code will throw exception?
DataTable dt1 = StreetLayer.QueryTools.ExecuteQuery("Select FENAME From IN039lkA Where FENAME Like('%" + street1 + "%');");
StreetLayer is using IN039lkA data.
 
I test this method by using “County” instead of street1, it works and will return 2639 records.
 
If your problem is like this, please let me know the value of street1 when the exception thrown.
 
If not, please explain your problem by simple code.
 
Thanks
 
James

James,


Yes, that is the code that throws the exception. I tried your suggestion with a SQL statement as shown in the second screenshot for this post. The first screenshot is of MapSuiteExplorer and shows that the query will return results. I have tried many ways of constructing the statement and still receive the exception.


If I execute this code in my SetupMap method it works fine and recieves the 2639 results:


 // Test after other layers of same file are open - This DOES work.             ShapeFileFeatureLayer AllRoads = new ShapeFileFeatureLayer(Path.Combine(INmapbase, @"Elkhart\IN039lkA.shp")); AllRoads.Open(); DataTable dtTest = AllRoads.QueryTools.ExecuteQuery("Select FENAME From IN039lkA Where FENAME Like('%County%');"); Console.WriteLine(dtTest.Rows.Count); AllRoads.Close();  


I have modified my code to allow me to switch between a list of counties for my demonstrations to management. I added a snippet of code to find the number of streets in the road layer to adjust the zoom level that it displays what style. Later in the same method I am running a query against the same layer to get a distinct list of Zip codes. When I first choose a county to display map etc, it works fine. If I attempt to go back to a previously viewed map I recieve that same lock error on the second query in the SetupMap method. I am currently opening and closing the layer for the first and then second query. I attempted to leave the layer open for both and still received the error.


I will attach everything I can think of to this message. The Elkhart county (IN039xxx) data will remain the same, but I will include the data for Adams and Allen as well. If you want the other county data from the sample I can provide that too, but you can test with just 3 counties. 


It looks like I am limited to 3 files per post or some size limit, so I will make replies to add the remaining files.



1679-ThinkGeoGIS_PoC-New.zip (177 KB)
1682-Adams-1.zip (369 KB)
1683-Adams-2.zip (242 KB)

I just noticed the source code didn't format at all correctly in the last post. Sorry.


Here is the Allen county data.


Please let me know if you need anything else. I have a LogMeIn Rescuse account, so if a screen sharing session would be helpful, I can arrange that and share my screen with you.


Thanks,


David



1684-Allen-1.zip (241 KB)
1685-Allen-2.zip (371 KB)
1686-Allen-3.zip (489 KB)

Forgot to add screenshots.



 




David,


Thanks for your patience.


I still can not recreate your problem, maybe I misunderstand your meaning.


So I have built a simple sample, could you modify the code and make it can recreate your problem?


I think this is more effiecient way to solve this problem.


Thanks


James



1690-QueryToolsTest.zip (10.1 KB)

I was able to reproduce the issue with a few lines of code. The problem starts when I call Map.Refresh. When you look at the code you will see my comments. I can do everything with the shapefile in my Form.Load event to setup the map and the button click event works SO LONG AS I do not call Map.Refresh. That seems to be the cause of the problem.



1691-QueryToolsTest_Showing_Error.zip (29.2 KB)

 


David,
 
I still can not recreate your problem even I execute a map.Refresh(). My sample only uses MapSuiteCore, but I noticed that you add DesktopEdition as reference, so I guess if only use QueryTools in MapSuiteCore it won’t cause the error.
 
In order to figure out what happened, you need to give us more information. I guess there is something different for our environment so that I can not recreate but you can.
If you can provide the following information I think it will be helpful.
 
The version of DesktopEdition? You can get the version by calling the static API WinformsMap.GetVersion().
What’s kind of OS? For example, WindowsXP SP2 64x French. 
Please attach your StackTrace for the exception.
 
 
Thanks
James

James,


Thank you for your continued help! The static returns: MapSuiteCore:3.1.299;DesktopEdition:3.1.299. Attached is the stack trace I am receiving when using the version of the QueryToolsTest I posted.


I have found a workaround for this, but I am really concerned about this issue because I am certain I will need this for our reporting elements.


 



RoadLayer.Open();
Collection<Feature> streetnames = RoadLayer.FeatureSource.GetAllFeatures(new string[] { "FENAME" });
string Street1Name = streetnames.FirstOrDefault(s => s.ColumnValues["FENAME"].ToString().ToUpper() == ConvertStreet(Street1).ToUpper()).ColumnValues["FENAME"].ToString();
string Street2Name = streetnames.FirstOrDefault(s => s.ColumnValues["FENAME"].ToString().ToUpper() == ConvertStreet(Street2).ToUpper()).ColumnValues["FENAME"].ToString();
Collection<Feature> street1features = RoadLayer.FeatureSource.GetFeaturesByColumnValue("FENAME", Street1Name);
Collection<Feature> street2features = RoadLayer.FeatureSource.GetFeaturesByColumnValue("FENAME", Street2Name);
RoadLayer.Close();

Best regards,


David



1700-ThinkGeo_QueryToolsTest_stacktrace.txt (9.16 KB)

 


David,
 
The information you provided is very helpful, I test the same version of DLL with yours, still can not recreate your problem.
 
Could you provide what your operating system is? I have tested Windows XP 32bit EN and Windows 7 32bit EN, they are working. The Windows XP 64bit EN will throw another exception “System.InvalidOperationException: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.”
 
So if you can provide more information to use, I think it will help us to recreate your problem. If we can recreate your problem in our side, the problem would be fixed easily.
 
Any special things you could let us know. 
 
I will do more research on strack trace and try to figure out the problem.
 
Thanks
 
James