ThinkGeo.com    |     Documentation    |     Premium Support

Oracle ORA-01747 error

Hello,

I have a similar problem related with this post gis.thinkgeo.com/Support/Dis...fault.aspx


first I followed your suggestion to grant permission to USER_SDO_GEOM_METADATA view, but I still have the problem that map suite don’t show anything, I used a snnifer to look what can be the problem and I can see the next SQL query to oracle


SELECT allColumns.COLUMN_NAME, geomMetaData.SRID 

FROM ALL_TAB_COLUMNS allColumns, USER_SDO_GEOM_METADATA geomMetaData 

WHERE allColumns.TABLE_NAME='AH' AND allColumns.DATA_TYPE='SDO_GEOMETRY' 

AND allColumns.TABLE_NAME= geomMetaData.TABLE_NAME

AND allColumns.owner=''


If I change the empty string of owner on this SQL statement to 

‘oUser’

I have the correct result. ‘oUser’ is my user to the service on Oracle. Do I miss something in the configuration of the database or in the connection string?

The next code is how do I’m testing this (I’m testing on Oracle 11g)


 


 


Dim strConnection As String

        Dim omsflFeatureLayer As ThinkGeo.MapSuite.Core.OracleFeatureLayer

        Dim staticoverlay = New LayerOverlay()




        WinformsMap1.MapUnit = GeographyUnit.Meter

        strConnection = "Data Source=192.168.16.10:1521/MyOracleService;User ID=oUser;Password=MyPass;"

        omsflFeatureLayer = New OracleFeatureLayer(strConnection, "AH", "IDAH")


        omsflFeatureLayer.Name = "AH"

        omsflFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.LightYellow, GeoColor.SimpleColors.Green)

        omsflFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20


        omsflFeatureLayer.Open()

        WinformsMap1.CurrentExtent = omsflFeatureLayer.GetBoundingBox()

        omsflFeatureLayer.Close()


        staticoverlay.Layers.Add("AH", omsflFeatureLayer)

        WinformsMap1.Overlays.Add("OracleLayers", staticoverlay)


        WinformsMap1.Refresh()



Abraham, 
  
 Thanks for your post, I think you can follow the two items below: 
  
 1.Please make sure the version of your Oracle client software is 8.1.7 or greater(not in the virtual machine; Also, if you add try-catch in your code, you’ll get the message)  
  
 2.The tablename must be case-sensitive. 
  
 Please let me know if these can’t solve your problem 
  
 Thanks, 
  
 Gary 


No, it hasn’t solved my problem. Look, this is the trace of error… 
  
 System.NullReferenceException: Object reference not set to an instance of an object. 
    en ThinkGeo.MapSuite.Core.OracleFeatureSource.xd821d05d1adb43ff(IEnumerable`1 x44b48f93f08f9199) 
    en ThinkGeo.MapSuite.Core.OracleFeatureSource.x278e6cfeb3a2b342(RectangleShape x8c1dcba6678ab3e6, Int32 x733eadfaaf7df35a, IEnumerable`1 xb3da24dbcff0ab0a) 
    en ThinkGeo.MapSuite.Core.OracleFeatureSource.GetFeaturesInsideBoundingBoxCore(RectangleShape boundingBox, IEnumerable`1 returningColumnNames) 
    en ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawingCore(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames) 
    en ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawing(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames) 
    en ThinkGeo.MapSuite.Core.FeatureLayer.DrawCore(GeoCanvas canvas, Collection`1 labelsInAllLayers) 
    en ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1 labelsInAllLayers) 
    en ThinkGeo.MapSuite.DesktopEdition.LayerOverlay.DrawCore(GeoCanvas canvas) 
    en ThinkGeo.MapSuite.DesktopEdition.Overlay.MainDraw(GeoCanvas canvas) 
    en ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas) 
    en ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x03e3d48bcfe7bb6c(IEnumerable`1 xa6f0db4f183189f1) 
    en ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xff5b27c00f9678c2(RectangleShape x178b193eec228e6e) 
    en ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xe3cee4adb9c72451() 
    en ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x9ac8c50f434f4b39(Int32 xb565f4681f05557a) 
    en ThinkGeo.MapSuite.DesktopEdition.WinformsMap.Refresh() 
    en MapSuiteDesktopEdition.MapLoadOracleLayer.MapLoadOracleLayer_Load(Object sender, EventArgs e) 
  
 this occurr in the refresh method of map.

Abraham, 
  
 Sorry to hear that the two items didn’t solve your problem, we did some tests and found out that it shouldn’t throw a NullReferenceException any way, if you can, could you please send your database table to us that we can do some tests on it and find out what goes wrong? 
  
 Thanks, 
  
 Gary

May be I can’t explain clearly in the first post. I think the problem is very clear, the last error is produced because when Map suite try to get the column in the table that has the geometry the result is null because as I said in the first post the owner is not specified in the sql statement generated by the map suite component (See bellow) 
 SELECT allColumns.COLUMN_NAME, geomMetaData.SRID  
 FROM ALL_TAB_COLUMNS allColumns, USER_SDO_GEOM_METADATA geomMetaData  
 WHERE allColumns.TABLE_NAME=‘AH’ AND allColumns.DATA_TYPE=‘SDO_GEOMETRY’  
 AND allColumns.TABLE_NAME= geomMetaData.TABLE_NAME 
 AND allColumns.owner=’’ 
  
 The problem here is how does map suite get the owner? Because as you see the owner is set as a null string…  
 How do I have to set the owner of the table in a way that map suite can identify correctly? 
 should I  change the grant or configure  something in the  schema  that I’m working? 


 Abraham,



 Sorry for the misunderstanding at the beginning. In the constructor of OracleFeatureSource, we are calling the SQL statement “select user from dual” to get the current User ID, which is the “allColumns.owner” in the final Select statement. I’m not sure why it is null on your machine. Here we wrapped our internal logic and wrote a console sample for you so you can play with it on your machine and see why it cannot get the correct userid. 


 Let us know what you find out. If it is our issue we will definitely fix it or provide a method so you can customize the way to get the username. 


 Thanks,


 Ben



GetCurrentUserId.zip (3.47 KB)

Ben, 
  
 Thanks for your project sample, we have the correct result for your project test, executing the command with the sql script  
 select user from dual 
 returns correctly the owner. 
 But we have the same error from MapSuite… with this clue of how does Map Suite get the owner we saw with the sniffer that this sql statement 
 select user from dual 
 never goes to oracle from MapSuite, the first SQL statement was the last I posted 
  
 SELECT allColumns.COLUMN_NAME, geomMetaData.SRID  
 FROM ALL_TAB_COLUMNS allColumns, USER_SDO_GEOM_METADATA geomMetaData  
 WHERE allColumns.TABLE_NAME=‘AH’ AND allColumns.DATA_TYPE=‘SDO_GEOMETRY’  
 AND allColumns.TABLE_NAME= geomMetaData.TABLE_NAME  
 AND allColumns.owner=’’ 
  
 Additional to your test we test this 
 strConnection = “Data Source=192.168.16.10:1521/MyOracleService;User ID=oUser;Password=MyPass;” 
 omsflFeatureLayer = New OracleFeatureLayer(strConnection, “AH”, “IDAH”) 
  
 omsflFeatureLayer.Open() 
 dtOracleLayer = omsflFeatureLayer.QueryTools.ExecuteQuery(“SELECT IDAH, SDO_UTIL.TO_WKTGEOMETRY(GEOM) AS GT FROM AH”) 
             MsgBox(“Geom:” + dtOracleLayer.Rows(0).Item(“GT”).ToString, MsgBoxStyle.Information, “Info”) 
             omsflFeatureLayer.Close() 
  
 And we have the correct result of the first geometry in text, any other suggestion? 


Abraham, 
  
 I guess you are not using the latest version.  It was an issue that the userID wasn’t set when calling the constructor, and we fixed it in November 2010. Please either get the latest version, or if you don’t want to update the assembly, set the ConnectionString property separately after calling the constructor, like this:  
  
omsflFeatureLayer.ConnectionString=“Data Source=192.168.16.10:1521/MyOracleService;User ID=oUser;Password=MyPass;”
 
  
 I think that will solve the problem. Let me know the version number of OracleExtension.dll if the issue still exists. 
  
 Thanks, 
  
 Ben

Ben, 
 Thank You very much, it’s working now. At this moment we prefer the solution of assigning the connection string again. But we are going to change to version 5. Ben any suggestion in the future to expend less time to solve this issues? Maybe you should add the complete log of bugs solved and additions here in the forum to found the resolutions faster.  
 Thanks Very Much 


Abraham,


We have the release change log on wiki, so if you are not using the latest version, please have a quick check the following link whether the issue has been fixed. Also it’s good if you can let us know your version number, we many times have an assumption people are using the latest public release, that’s not good though and we on our side should ask proactively. 


wiki.thinkgeo.com/wiki/Map_S...Change_Log


Oracle related issue needs to setup the environment to test and the 3rd part tool every now and then brings some uncertain issues, that's a reason we are somehow weak on this kind of questions. This is one thing we are trying to catch up, sorry for the inconvenience now and I’m sure things will be better.


Thanks,


Ben



I have an additional question related to this topic. 
 How can you access Oracle Spatial tables with geo data whose owner is an user or role different from the currently logged user? 
 For example, the current user has a role that can access the tables, but MapSuite generates queries that use the current user id, and not the role name I need. 
 I know I can adjust some queries in ExecutingSqlStatement event and correct the user, but what about the queries used internally by MapSuite? 
 Is there a way to indicate a different user or role to be used in all queries? 
  
 Thanks, 
 César M. 
  


 César,


Thanks for raising it up.


We are using “select user from dual” to get the current userId, which will then be the owner in all the SQL queries generated internally.  So do you mean instead of the currently logged user, we need to use the role name? Sorry I am not an Oracle guru so could you please give me more instruction about this?


Although you said you can correct the user in ExecutingSqlStatement event, still wonder why you want a way to indicate it different as we can simply change the user name in the connection string? I think it relates to the first question as well so can you give me a more specific scenario of it?


 Thanks,


 Ben