引言: 这次的主要内容是连接SDE加载数据和开始编辑时候碰到的问题
一:关于初始化问题
这个主要是关系到许可的问题,如果许可初始化不到位的话,那么功能很容易报错,出现各式各样的错误。
自己碰到的大约有几个:
1. 检索 COM 类工厂中 CLSID 为 {4AFAF64D-0CB2-4ADB-BC88-9FB07548D10D} 的组件失败,原因是出现以下错误: 80040111 ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。(因为没有绑定产品)
2.异常来自 HRESULT:0x8004021F(许可为初始化,由于是SDE编辑,所以需要esriLicenseProductCodeEngineGeoDB许可)
初始化代码如下:
public static class LiscenseManager
{
/// <summary>
/// 用来初始化许可
/// </summary>
public static void StratUsing()
{
RuntimeManager.Bind(ProductCode.EngineOrDesktop);
IAoInitialize PAoInitialize = new AoInitializeClass();
PAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
esriLicenseStatus _LicenseStatus = PAoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
if (_LicenseStatus == esriLicenseStatus.esriLicenseAvailable)
{
//PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeVBAExtension);
// PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst);
}
//if (PAoInitialize.IsExtensionCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine, esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst) == esriLicenseStatus.esriLicenseUnavailable)
//{
// PAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst);
//}
}
}
将初始化代码写在main函数里面即可。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LiscenseManager.StratUsing();
Application.Run(new Form1());
}
二:连接SDE加载数据
SDE连接方式有两种,这里说的是代码写法上的两种中哈。
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory");
IWorkspaceFactory2 pWorkspaceFactory2 = (IWorkspaceFactory2)Activator.CreateInstance(factoryType);//两种方式区别主要在这块
//另一种是 IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();
if (pWorkspaceFactory2 != null)
{
m_WorkspaceFactory2 = pWorkspaceFactory2;
}
IPropertySet pPropertySet = new PropertySet();
pPropertySet.SetProperty("SERVER", "hangye");
pPropertySet.SetProperty("SERVICES", "5151");
pPropertySet.SetProperty("USER", "sde");
pPropertySet.SetProperty("PASSWORD", "sde");
pPropertySet.SetProperty("VERSION", "sde.DEFAULT");
IWorkspace pWorkspace = pWorkspaceFactory2.Open(pPropertySet,0);
if (pWorkspace != null)
{
m_Workspace = pWorkspace;
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass);
IDataset pDataset = pEnumDataset.Next();
while (pDataset != null)
{
// IFeatureDataset pFeatureDataset = pDataset as IFeatureDataset;
//IEnumDataset pChildDataset = pFeatureDataset.Subsets;
// IDataset pChildlayer=pChildDataset.Next();
//while (pChildlayer != null)
//{
IFeatureClass pFeatureClass = pDataset as IFeatureClass;
IFeatureLayer pFeatureLayer = new FeatureLayer();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.SpatialReference = (pDataset as IGeoDataset).SpatialReference;
axMapControl1.Map.AddLayer(pFeatureLayer as ILayer);
// pChildlayer = pChildDataset.Next();
//}
pDataset = pEnumDataset.Next();
}
}
三 编辑数据
说明一点,以前做编辑是直接用的IWorkSpaceEdit借口来启动编辑等等,最近在看到帮助文档时候说到了IEngineEditor接口,于是就尝试用一下,看看效果。
具体参看。http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/How_to_create_an_edit_session/0001000000qv000000/
启动编辑代码如下:红色部分值得注意,如果不设置编辑类型,则会报异常来自 HRESULT:0x80040356,这个设置类似用在Arcmap中Edit工具栏下来的Opetions选项的Versision选项卡。
IEngineEditor m_EngineEditor = new EngineEditor();
if (m_EngineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing)
{
m_EngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeNonVersioned;
m_EngineEditor.StartEditing(m_Workspace as IWorkspace, axMapControl1.Map);
}
开始编辑成功。先到此为止。