ThinkGeo.com    |     Documentation    |     Premium Support

'DBF file is being used by another process' error during the search

Hello,


My application throws an error wnen searching through a shape file:


"The process cannot access the file '...\xxx.dbf' because it is being used by another process."


Here is my code:


ShapeFileFeatureLayer allProperties = new ShapeFileFeatureLayer(context.Server.MapPath("~/.../xxx.shp"));

allProperties.Open();

DataTable dt = allProperties.QueryTools.ExecuteQuery("SELECT PropertyNa, Longitude, Latitude, StatusID, DrillHole, Featured FROM All WHERE PropertyID IN (" + propertyIds + ") ");

allProperties.Close();


I guess, it happened because the search through a shape file takes some times and this file is locked during this time (because Open/Close methods) . When other search is executing and file is locked, an error is thrown.  


Is any way not to lock a file during search? How can I handle this error?


Thanks,


Igor


 


 


 


 


 


 


 


 



Hi Igor,


Is this code block in a multi-thread scope?If so, please try to add a locker, or you can send a sample that could recreate the issue to us to solve it efficiency.


Thanks,


Edgar



Hi Edgar, 



Thank you for your reply. I don't use multi-treading in my application. We got this problem when publish the application on a production server and a lot of clients start searching at the same time. It errors occurs only when there are several searches at the same time. 



Does Open() method lock the dbf-file? 



Below is complete code of my function: 





private void addSearchResult() 



try 



string propertyIds; 



if (!String.IsNullOrEmpty(hdnPropertyIds.Value)) 

propertyIds = hdnPropertyIds.Value; 

else if (!String.IsNullOrEmpty(Request.QueryString["pid"])) 

propertyIds = Request.QueryString["pid"]; 

else 

return; 





ShapeFileFeatureLayer allProperties = new ShapeFileFeatureLayer(Server.MapPath("~/.../xxx.shp")); 

allProperties.Open(); 

DataTable dt = allProperties.QueryTools.ExecuteQuery("SELECT PropertyNa, Longitude, Latitude, StatusID, StatusName, TypeName, DrillHole, Featured FROM All WHERE PropertyID IN (" + propertyIds + ") "); 

allProperties.Close(); 



LayerOverlay customOverlay = (LayerOverlay)Map1.CustomOverlays["Properties"]; 

InMemoryFeatureLayer layer = (InMemoryFeatureLayer)customOverlay.Layers["SearchResults"]; 



LayerOverlay customLabelOverlay = (LayerOverlay)Map1.CustomOverlays["PropertyLabels"]; 

InMemoryFeatureLayer labelLayer = (InMemoryFeatureLayer)customLabelOverlay.Layers["SearchResultsLabel"]; 



layer.InternalFeatures.Clear(); 

labelLayer.InternalFeatures.Clear(); 



RectangleShape extent = null; 

double x = 0, y = 0; 



foreach (DataRow p in dt.Rows) 



x = Convert.ToDouble(p["Longitude"].ToString()); 

y = Convert.ToDouble(p["Latitude"].ToString()); 

Feature f = new PointShape(x, y).GetFeature(); 

f.ColumnValues.Add("PropertyNa", p["PropertyNa"].ToString()); 

f.ColumnValues.Add("StatusName", p["StatusName"].ToString()); 

f.ColumnValues.Add("TypeName", p["TypeName"].ToString()); 

f.ColumnValues.Add("Featured", p["Featured"].ToString()); 

f.ColumnValues.Add("Longitude", p["Longitude"].ToString()); 

f.ColumnValues.Add("Latitude", p["Latitude"].ToString()); 



if (extent == null) 

extent = f.GetBoundingBox(); 

else 

extent.ExpandToInclude(f.GetBoundingBox()); 



layer.InternalFeatures.Add(f); 

labelLayer.InternalFeatures.Add(f); 











catch (Exception exp) 



sendEmail("home page mapper error", "addSearchResult(): " + exp.Message); 







}



Igor, 
  
 The Open method will not lock the file, besides, we tried to create a sample like yours to recreate the scenario but failed, could you please send your sample to us to have a test? Maybe we can find out the problem there. 
  
 Thanks, 
  
 Edgar

Thank you, Edgar! I've just sent a light version of my app to ThinkGeo Customer Portal



Hello Igor, 
  
 Please check the ticket for more details. 
  
 Regards, 
  
 Gary