ThinkGeo.com    |     Documentation    |     Premium Support

QueryTools file names

Hi,


I´m trying to use QueryTools.ExecuteQuery in a ShapeFileFeatureLayer object. If the shapefile is stored in a file name that includes blanks, for example 'D:\Test  File\Maranhao.shp" I get the "Syntax error in FROM clause" error message. If the shp file name looks like 'D:\TestFile\Maranhao.shp" iot works. I tried to use a DOS 8.3 sintax as well (D:\TESTPA~1\MARAMNHAO.SHP) but it doesn´t work as well.


How can I specify this file name in a way it works? 


Attached, there´s the application I used to test. You must put it in a directory that includes blanks (of course) to see what´s happening.


Thanks in advance,


Mauro Assis


 



Test_Path.zip (397 KB)

Mauro,


Thanks for your post and questions.
In our product, we use the OLEDB to do the SQL query against the shape file.  Following post show you how to use the OLEDB directly to SQL query against the shape file, I think the reason for this problem is that the OLEDB does not support this.
gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/6043/afv/topic/afpgj/1/Default.aspx#10062
Any more questions please feel free to let me know.
Thanks.
Yale

Hello, 
  
 I had more or less the same issue as Mauro reported. In fact the query fails if: 
 1. The file path has blanks and/or 
 2. The file name is longer than 8 chars (suffix not included).  
  
 I will give it a try with the OLDDB as advised although I am a little bit reluctant to go this way as client’s machines may have “exotic” configurations, to say the least. Any chance for this to be fixed? 
  
 Kind Regards 
 Yiannis

Yiannis,


Thanks for your post and questions.
 
I do not think we can have a fix for this issue for now because its root reason is the OLEDB cannot support it, Sorry for the inconvenience. I will take a second think to see if we can go around this issue.
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hello again,


As I promised, I took a closer look in the example you provided here and you are right. This is the only way to be done for the time been. In fact I think it needs to be extended a little bit. What I mean is that if you take a look in your example as shown below


DataTable dataTable = ExcuteSqlUsingOledb("Select * from [AUSTIN~1]", @"C:\PostsData\Austinstreets.shp");

 


you assume a short name conversion, [AUSTIN~1] in this example, for this to operate anyway.This conversion is one of the issues existed before hand and had to be tackled. So for reasons of completion I think the correct solution has two legs:



        
  1. First we need to make a proper conversion to short file name

  2.     
  3. Then use your code to get the Datatable form olddb


Module HellperUitls
<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
 Public Function GetShortPathName(ByVal longPath As String, _
 <MarshalAs(UnmanagedType.LPTStr)> ByVal ShortPath As System.Text.StringBuilder, _
 <MarshalAs(Runtime.InteropServices.UnmanagedType.U4)> ByVal bufferSize As Integer) As Integer
 End Function
End module
Public Class ourClass
Public Sub ourSub()
Dim shortPath As New StringBuilder(255)
GetShortPathName(sFileName, shortPath, shortPath.Capacity)
Dim file = shortPath.ToString.Substring(shortPath.ToString.LastIndexOf("\") + 1)
Dim atable As DataTable = ExcuteSqlUsingOledb("select min(first_date), max(last_date) from [" & file & "]", sFileName)
end sub
end class


What I can't understand is why the the OleDbCommand accepts an OleDbConnection constructed with long file names while the actual query executed against this olddb connection can't have a fully named shp file. But I guess it does exactly the same conversion that i do internally.


Let me know what do you think as I am not sure which is more dangerous. To make calls to unmanaged code or to assume some arbitary short name conversion?


Kind Regards


Yiannis


 



Ioannis,


Sorry for the delay.
 
When I deal with some ticket, I found that following code works in my Windows 7 x 64 environments, just share with you, hope it can give us some encouraging hints.
 

string shapeFile4 = @"C:\Program Files (x86)\ThinkGeo\Map Suite Desktop Evaluation Edition 3.0\Samples\SampleData\Data\Countries02.shp";
TestShapeFile(shapeFile4);
 
 
private static void TestShapeFile(string shapeFile)
        {
            FileInfo fileInfo = new FileInfo(shapeFile);
            string fileName = fileInfo.Name;
            System.Diagnostics.Debug.WriteLine(fileName);
            fileName = fileName.Remove(fileName.Length - 4, 4);
            string sqlStatement = string.Format("Select * from {0}", fileName); ;
            ShapeFileFeatureLayer shapeFileFetureLayer = new ShapeFileFeatureLayer(shapeFile, ShapeFileReadWriteMode.ReadOnly);
            try
            {
                shapeFileFetureLayer.Open();
                DataTable table = shapeFileFetureLayer.QueryTools.ExecuteQuery(sqlStatement);
                int count = table.Rows.Count;
                System.Diagnostics.Debug.WriteLine(count.ToString());
            }
            finally
            {
                shapeFileFetureLayer.Close();
            }
        }

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

Yale,


Did you get the QueryTools to work targeting Any CPU on Windows 7 64-bit?  I get an error that says Microsoft.Jet.OLEDB.4.0 is not registered on the local machine when I run Any CPU.  If I flip it to x86 it works, but I have to use Any CPU because the application that does shapefile queries is launched by another application that targets Any CPU.


Is there a workaround to query a shapefile with a 64-bit compliant DBASE driver?  Thanks,


Chad



Chad,


You can set your Platform to x86, please see following screen-shot:



Thanks,


James



James,


Yes the x86 build works.  Thank you.   My next question is related to shapefile labeling.  We can get shapeflie labels to work regardless of cpu (32 or 64).  I'm assuming you guys have to query the dbf somehow to get the attributes to use for the labels.  So what is the difference between labeling and querying a shapefile?  Why does labeling work and querying not work?  Thanks,


Chad



Chad, 
  
 Your question is good. 
  
 They work with different way, querying rely on Microsoft.Jet.OLEDB.4.0 that x64 platform doesn’t support it, however labeling rely on our Dbf engine, all code is our managed code without any OldDb API, you can research on our exposed class GeoDbf for detail. 
  
 Thanks, 
  
 James