一、问题描述: 异常来自 HRESULT : 0x8004021F
这是同事在做GeoDatabase 方面的开发时遇到的问题,我拿到他的源代码分析一下,发现程序代码逻辑上并没有什么Bug 。用百度搜索下,有且仅只找到两条相关记录,都是求救的贴子,下文毫无解决办法,看了等于白看,心里稍微安慰的是知道以前有人也遇到过类似的问题,算是前有来者了,自己并不孤独。可是这还是无济于事,问题依然还是问题。
二、问题分析:
下面是自己参考ArcGIS
开发帮助文档写的创建FeatureClass
的代码实例,调试时还是会弹出前面所描述的错误,用IFeatureDataset
创建要素类时弹出的好像是license
权限不够,估计是license
没有签出的缘故。
三、问题解决方法:
经过分析确定是
license
权限不够,因此我们只需将与此相关的
license
(
esriLicenseProductCode
.esriLicenseProductCodeEngineGeoDB
)
签出即可。修改
license
初始化代码,签出相关的
license
授权,即解决了问题。
1
/**/
///
<summary>
2
///
创建要素类
3
///
</summary>
4
///
<param name="pObject">
IWorkspace或者IFeatureDataset对象
</param>
5
///
<param name="pName">
要素类名称
</param>
6
///
<param name="pSpatialReference">
空间参考
</param>
7
///
<param name="pFeatureType">
要素类型
</param>
8
///
<param name="pGeometryType">
几何类型
</param>
9
///
<param name="pFields">
字段集
</param>
10
///
<param name="pUidClsId">
CLSID值
</param>
11
///
<param name="pUidClsExt">
EXTCLSID值
</param>
12
///
<param name="pConfigWord">
配置信息关键词
</param>
13
///
<returns>
返回IFeatureClass
</returns>
14
public
static
IFeatureClass CreateFeatureClass(
object
pObject,
string
pName, ISpatialReference pSpatialReference, esriFeatureType pFeatureType,
15
esriGeometryType pGeometryType, IFields pFields, UID pUidClsId, UID pUidClsExt,
string
pConfigWord)
16
{
17
错误检测
#region
错误检测
18
if
(pObject
==
null
)
19
{
20
throw
(
new
Exception(
"
[pObject] 不能为空!
"
));
21
}
22
if
(
!
((pObject
is
IFeatureWorkspace)
||
(pObject
is
IFeatureDataset)))
23
{
24
throw
(
new
Exception(
"
[pObject] 必须为IFeatureWorkspace 或者 IFeatureDataset
"
));
25
}
26
if
(pName.Length
==
0
)
27
{
28
throw
(
new
Exception(
"
[pName] 不能为空!
"
));
29
}
30
if
((pObject
is
IWorkspace)
&&
(pSpatialReference
==
null
))
31
{
32
throw
(
new
Exception(
"
[pSpatialReference] 不能为空(对于单独的要素类)
"
));
33
}
34
#endregion
35

36
pUidClsID字段为空时
#region
pUidClsID字段为空时
37
if
(pUidClsId
==
null
)
38
{
39
pUidClsId
=
new
UIDClass();
40
switch
(pFeatureType)
41
{
42
case
(esriFeatureType.esriFTSimple):
43
if
(pGeometryType
==
esriGeometryType.esriGeometryLine)
44
pGeometryType
=
esriGeometryType.esriGeometryPolyline;
45
pUidClsId.Value
=
"
{52353152-891A-11D0-BEC6-00805F7C4268}
"
;
46
break
;
47
case
(esriFeatureType.esriFTSimpleJunction):
48
pGeometryType
=
esriGeometryType.esriGeometryPoint;
49
pUidClsId.Value
=
"
{CEE8D6B8-55FE-11D1-AE55-0000F80372B4}
"
;
50
break
;
51
case
(esriFeatureType.esriFTComplexJunction):
52
pUidClsId.Value
=
"
{DF9D71F4-DA32-11D1-AEBA-0000F80372B4}
"
;
53
break
;
54
case
(esriFeatureType.esriFTSimpleEdge):
55
pGeometryType
=
esriGeometryType.esriGeometryPolyline;
56
pUidClsId.Value
=
"
{E7031C90-55FE-11D1-AE55-0000F80372B4}
"
;
57
break
;
58
case
(esriFeatureType.esriFTComplexEdge):
59
pGeometryType
=
esriGeometryType.esriGeometryPolyline;
60
pUidClsId.Value
=
"
{A30E8A2A-C50B-11D1-AEA9-0000F80372B4}
"
;
61
break
;
62
case
(esriFeatureType.esriFTAnnotation):
63
pGeometryType
=
esriGeometryType.esriGeometryPolygon;
64
pUidClsId.Value
=
"
{E3676993-C682-11D2-8A2A-006097AFF44E}
"
;
65
break
;
66
case
(esriFeatureType.esriFTDimension):
67
pGeometryType
=
esriGeometryType.esriGeometryPolygon;
68
pUidClsId.Value
=
"
{496764FC-E0C9-11D3-80CE-00C04F601565}
"
;
69
break
;
70
}
71
}
72
#endregion
73

74
pUidClsExt字段为空时
#region
pUidClsExt字段为空时
75
if
(pUidClsExt
==
null
)
76
{
77
switch
(pFeatureType)
78
{
79
case
esriFeatureType.esriFTAnnotation:
80
pUidClsExt
=
new
UIDClass();
81
pUidClsExt.Value
=
"
{24429589-D711-11D2-9F41-00C04F6BC6A5}
"
;
82
break
;
83
case
esriFeatureType.esriFTDimension:
84
pUidClsExt
=
new
UIDClass();
85
pUidClsExt.Value
=
"
{48F935E2-DA66-11D3-80CE-00C04F601565}
"
;
86
break
;
87
}
88
}
89
#endregion
90

91
字段集合为空时
#region
字段集合为空时
92
if
(pFields
==
null
)
93
{
94
//
实倒化字段集合对象
95
pFields
=
new
FieldsClass();
96
IFieldsEdit tFieldsEdit
=
(IFieldsEdit)pFields;
97

98
//
创建几何对象字段定义
99
IGeometryDef tGeometryDef
=
new
GeometryDefClass();
100
IGeometryDefEdit tGeometryDefEdit
=
tGeometryDef
as
IGeometryDefEdit;
101

102
//
指定几何对象字段属性值
103
tGeometryDefEdit.GeometryType_2
=
pGeometryType;
104
tGeometryDefEdit.GridCount_2
=
1
;
105
tGeometryDefEdit.set_GridSize(
0
,
1000
);
106
if
(pObject
is
IWorkspace)
107
{
108
tGeometryDefEdit.SpatialReference_2
=
pSpatialReference;
109
}
110

111
//
创建OID字段
112
IField fieldOID
=
new
FieldClass();
113
IFieldEdit fieldEditOID
=
fieldOID
as
IFieldEdit;
114
fieldEditOID.Name_2
=
"
OBJECTID
"
;
115
fieldEditOID.AliasName_2
=
"
OBJECTID
"
;
116
fieldEditOID.Type_2
=
esriFieldType.esriFieldTypeOID;
117
tFieldsEdit.AddField(fieldOID);
118

119
//
创建几何字段
120
IField fieldShape
=
new
FieldClass();
121
IFieldEdit fieldEditShape
=
fieldShape
as
IFieldEdit;
122
fieldEditShape.Name_2
=
"
SHAPE
"
;
123
fieldEditShape.AliasName_2
=
"
SHAPE
"
;
124
fieldEditShape.Type_2
=
esriFieldType.esriFieldTypeGeometry;
125
fieldEditShape.GeometryDef_2
=
tGeometryDef;
126
tFieldsEdit.AddField(fieldShape);
127
}
128
#endregion
129

130
//
几何对象字段名称
131
string
strShapeFieldName
=
""
;
132
for
(
int
i
=
0
; i
<
pFields.FieldCount; i
++
)
133
{
134
if
(pFields.get_Field(i).Type
==
esriFieldType.esriFieldTypeGeometry)
135
{
136
strShapeFieldName
=
pFields.get_Field(i).Name;
137
break
;
138
}
139
}
140

141
if
(strShapeFieldName.Length
==
0
)
142
{
143
throw
(
new
Exception(
"
字段集中找不到几何对象定义
"
));
144
}
145

146
IFeatureClass tFeatureClass
=
null
;
147
if
(pObject
is
IWorkspace)
148
{
149
//
创建独立的FeatureClass
150
IWorkspace tWorkspace
=
pObject
as
IWorkspace;
151
IFeatureWorkspace tFeatureWorkspace
=
tWorkspace
as
IFeatureWorkspace;
152
tFeatureClass
=
tFeatureWorkspace.CreateFeatureClass(pName, pFields, pUidClsId, pUidClsExt, pFeatureType, strShapeFieldName, pConfigWord);
153
}
154
else
if
(pObject
is
IFeatureDataset)
155
{
156
//
在要素集中创建FeatureClass
157
IFeatureDataset tFeatureDataset
=
(IFeatureDataset)pObject;
158
tFeatureClass
=
tFeatureDataset.CreateFeatureClass(pName, pFields, pUidClsId, pUidClsExt, pFeatureType, strShapeFieldName, pConfigWord);
159
}
160

161
return
tFeatureClass;
162
}
三、问题解决方法:
经过分析确定是 license 权限不够,因此我们只需将与此相关的 license ( esriLicenseProductCode .esriLicenseProductCodeEngineGeoDB ) 签出即可。修改 license 初始化代码,签出相关的 license 授权,即解决了问题。

相关评论
