How to define OID field for layer based on Oracle View?

779
0
09-20-2016 07:59 AM
FrancescoSozzi1
New Contributor

Dear Sirs,

I'm in trouble on trying to programmatically change connection properties for all layers on a map. I can do manually, but not by coding.

All layers are based on Oracle views not registered into SDE. All these Oracle views have not a defined key.

My approach is to get new feature class from a workspace based on my new connection and set this resulting feature class to original feature layer. The problem is that I loose definition for Unique Identifier Field (or OID): after setting new feature class, hasOID = false. But if I do manually, all works properly:

1) I press "Change Query",

2) I choose Oracle view from my new sde connection

3) ArcMap show me window for choosing Unique Identifier Field: I set it

..and all is ok.

Here you are my code, the part in bold is where I try to set OID: it gives no errors, but if I try to open data window I get an error.

So, my question is: how can I define OID field name to a feature class got from IFeatureWorkspace:OpenFeatureClass?

foreach(IFeatureLayer featureLayer in featureLayers)
{
 //check connection properties
 IDataset dataSet = (IDataset)featureLayer;
 IDatabaseConnectionInfo4 databaseConnectionInfo = (IDatabaseConnectionInfo4)dataSet.Workspace;
 string connectedUser = databaseConnectionInfo.ConnectedUser;

 //create workspace
 Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory");
 IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
 IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(@"C:\test\mySdeFile.sde", 0);
  
 //set new feature class by opening on new workspace
 IFeatureClass oldFestureClass = featureLayer.FeatureClass;
 featureLayer.FeatureClass = featureWorkspace.OpenFeatureClass(featureLayer.FeatureClass.AliasName);

 //set old spatial reference to new feature class
 IGeoDatasetSchemaEdit geoDatasetSchemaEdit = (IGeoDatasetSchemaEdit)featureLayer.FeatureClass;
 geoDatasetSchemaEdit.AlterSpatialReference(oldSpatialreference);

 //set old OID to new feature class
 int idx = featureLayer.FeatureClass.Fields.FindFieldByAliasName(oldOIDFieldName);
 IFieldEdit field = (IFieldEdit)featureLayer.FeatureClass.Fields.Field[idx];
 field.Type_2 = esriFieldType.esriFieldTypeOID;                   
       
 //refresh
 ((IMapAdmin)mxDocument.FocusMap).FireChangeFeatureClass(oldFestureClass, featureLayer.FeatureClass);
 mxDocument.CurrentContentsView.Refresh(null);                   
}

Anybody has any idea on what I can do to set OID field?..

Tags (2)
0 Kudos
0 Replies