ThinkGeo.com    |     Documentation    |     Premium Support

Case sensitivity in PostgreSqlFeatureLayer

Hi,


I am having some trouble reading from a PostGIS database. There are schemas and tables with names that are in a mix of cases. PostgreSQL is case sensitive and I can't find a way to pass the table name through from PostgreSqlFeatureLayer to the database and retain the case.


I have a schema called "Fosar_NWE" and a table called "Pipelines"


For the schema name I can do something like:


pg.SchemaName = """Fosar_NWE"""


but this doesn't work for the table name..


Dim pg As PostgreSqlFeatureLayer = New PostgreSqlFeatureLayer()


pg.GeometryColumnName = "the_geom"
pg.ConnectionString = cstring
pg.FeatureIdColumn = "gid"
pg.SchemaName = """Fosar_NWE"""
pg.TableName = "Pipelines"
pg.Name = "Fosar_NWE.Pipelines"


 I have tried:


pg.TableName = """Pipelines""" 


this throws an exception in NpgsqlException : ERROR: 42601: zero-length delimited identifier at or near """"


and I tried:


pg.Tablename = "'Pipelines'"


which throws ERROR: 42P01: relation "Fosar_NWE.'pipelines'" does not exist


 


Any help greatly appreciated!


Jeremy



Hi Jeremy, 
  
 Sorry we cannot do anything about this, due to the postgre database is case sensitive, you should either change the table name in your database or the table name in your code to make them match together. 
  
 Regards, 
  
 Edgar

Hi Edgar, 



thanks for your comment - I am trying to change the table name in my code to match. I change the PostgreSqlFeatureLayer.TableName property to match, but the query fails because somewhere in your codebase (ie by the time the query hits the database)  it is not preserving the case... 



The case of the Schema property is correctly preserved, but TableName is not. 



Changing the name of the table is not an option as the purpose of this code is to link data from customer databases into our application. 



Jeremy



Jeremy,
 
We didn’t do anything about the table name that user passed in, maybe your customers table name is still different from yours, I made a test on our database without the MapSuite dlls, you can have a try, and please reference the Npgsql.dll first,

            string sqlStatement = “select f_geometry_column,srid from geometry_columns where f_table_name=‘states’”;
            //string sqlStatement = “select f_geometry_column,srid from geometry_columns where f_table_name=‘States’”;

            NpgsqlConnection conn = new NpgsqlConnection(connectString);
            conn.Open();
            NpgsqlCommand command = new NpgsqlCommand(sqlStatement, conn);
            command.Prepare();
            NpgsqlDataReader dataReader = command.ExecuteReader();

            if (dataReader.Read())
            { }
            else
            {
                throw new Exception();
            }

 
the code works fine and if I replace the “states” instead of “States”, and the exception is thrown, so please confirm that the table name you input matches the table name in the databse.
 
Thanks,
 
Edgar

Yes if I go directly through Npgsql instead of using the PostgreSqlFeatureLayer then it works fine… However I was hoping to use your extension rather than having to reproduce all its functionality!

I see, so what version are you using? Maybe it’s a bug in the old version. 
  
 Thanks, 
  
 Edgar

I updated a week ago from your daily build: 
  
 PostgreExtension.dll 6.0.122.0 
 Npgsql.dll 2.0.11.93 


Jeremy, 
  
 I did some tests, but still confused. 
  
 Could you please show me the following things? 
  
 1. The real table name in the database. 
 2. The sql statement you used Npgsql which works fine. 
  
 Thanks, 
  
 Edgar

Edgar,


I have worked around the problem now by using npgsql and putting the features into an InMemoryFeatureLayer so my problem is resolved.   For your info I am using PostgreSQL version 9.1.2, postgis_lib_version is 1.5.3 and the table in the PostGIS DB is:


Fosar_NWE.Pipelines


and the way I have coded it now (which works) is:


string cstring = "Server=Lon-Gravel;Database=geoDatabase;User Id=####;Password=####;Port=5432";
cstring schema = "Fosar_NWE";
NpgsqlConnection conn = new NpgsqlConnection(cstring);
conn.Open();
NpgsqlCommand com = new NpgsqlCommand();
com.Connection = conn;
com.CommandText = "set search_path to '" + schema + "', public";
com.ExecuteNonQuery();

string colname = "the_geom";
string table = "Pipelines";
string sqlt = "select *, st_astext(" + colname + ") as geometry from \"" + table + "\"";

NpgsqlCommand command = new NpgsqlCommand(sqlt, conn);
command.Prepare();
NpgsqlDataReader dataReader = command.ExecuteReader();

Hope that is useful info,  Jeremy



Jeremy, 


I tested with your code, it could also work properly with PostgreFeatureLayer, 



            PostgreSqlFeatureLayer layer = new PostgreSqlFeatureLayer();
            layer.GeometryColumnName = "shape";
            layer.ConnectionString = connString;
            layer.FeatureIdColumn = "oid";
            layer.SchemaName = "public";
            layer.TableName = "FddfsS";
            layer.Name = "layer";
            layer.Srid = 4326;
            layer.Open();


So what exception are you getting?


Thanks,


Edgar



Edgar, 



 PostgreSqlFeatureLayer layer = new PostgreSqlFeatureLayer(); layer.GeometryColumnName = "the_geom"; layer.ConnectionString = cstring; layer.FeatureIdColumn = "oid"; layer.SchemaName = "Fosar_NWE"; layer.TableName = "Pipelines"; layer.Name = "layer"; layer.Srid = -1; layer.Open();  layer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = new PointStyle(PointSymbolType.Circle, new GeoSolidBrush(GeoColor.SimpleColors.BrightOrange), 4); layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;  LayerOverlay ol = new LayerOverlay(); ol.Name = "Fosar_NWE.PipelinesOverlay"; ol.Layers.Add(layer); Map1.Overlays.Add(ol); Map1.Refresh(ol);  



I get an NpgsqlException on the last line above, when I try to refresh the overlay with the PostgreSqlFeatureLayer on: 



{"ERROR: 3F000: schema "fosar_nwe" does not exist"} 



the stack trace for the exception: 



Stack Trace:

Npgsql.dll

   at Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__a.MoveNext()

   at Npgsql.NpgsqlState.IterateThroughAllResponses(IEnumerable`1 ienum)

   at Npgsql.NpgsqlReadyState.Flush(NpgsqlConnector context)

   at Npgsql.NpgsqlCommand.Prepare()

   at ThinkGeo.MapSuite.Core.PostgreSqlFeatureSource.3xM=(BaseShape 4BM=, Int32 4RM=, IEnumerable`1 4hM=)

   at ThinkGeo.MapSuite.Core.PostgreSqlFeatureSource.GetFeaturesInsideBoundingBoxCore(RectangleShape boundingBox, IEnumerable`1 returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawingCore(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawing(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureLayer.DrawCore(GeoCanvas canvas, Collection`1 labelsInAllLayers)

   at ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1 labelsInAllLayers)

   at ThinkGeo.MapSuite.DesktopEdition.LayerOverlay.DrawCore(GeoCanvas canvas)

   at ThinkGeo.MapSuite.DesktopEdition.Overlay.rRM=(GeoCanvas rhM=)

   at ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.yhU=(IEnumerable`1 yxU=)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.yBU=(RectangleShape yRU=)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.FxY=()

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.ExY=(Int32 FBY=)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.Refresh(IEnumerable`1 redrawOverlays)

   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.Refresh(Overlay redrawOverlay)
<processbackendresponses_ver_3>

</processbackendresponses_ver_3>



Jeremy, 
  
 So the original issue is the case of schema? I thought it was the table name. I checked our code, and found the schema was not rounded with "", this issue has been fixed and please get the 6.0.130.0 or 6.0.0.130 and have a try. 
  
 Regards, 
  
 Edgar

Yes I think it may have been the schema that was the original problem - sorry for any confusion caused! 
  
 I will try out the fixed build tomorrow once it’s available and let you know how it goes - thanks. 
  
 Jeremy

Hello Jeremy, 
  
 Feel free to let us know if you still have problem. 
  
 Regards, 
  
 Gary

I have tested your build from last night (6.0.130.0) and everything now works! 
  
 Many thanks, 
  
 Jeremy

Hello Jeremy, 
  
 You are always welcome, please feel free to let us know your problem. 
  
 Regards, 
  
 Gary