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?..