ArcgisEngine中将shape中的要素复制到指定的SDE空间数据集里-报错

//将shape里的要素导入到SDE空间数据集里
public void ConvertShapefileToFeatureClass(IServerContext serverContext,string str_shapepath, IWorkspace targetWorkspace, string str_sourceDatasetName, string str_targetDatasetName)
        {
            // Create a name object for the source (shapefile) workspace and open it.
            IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass
            {
                WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory",
                PathName = str_shapepath
            };
            IName sourceWorkspaceIName = (IName)sourceWorkspaceName;
            IWorkspace sourceWorkspace = (IWorkspace)sourceWorkspaceIName.Open();

            // Create a name object for the target (SDE) workspace and open it.
            IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
            IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
            IName targetWorkspaceIName = (IName)targetWorkspaceName;

            // Create a name object for the source dataset.
            IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
            IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
            sourceDatasetName.Name = str_sourceDatasetName;
            sourceDatasetName.WorkspaceName = sourceWorkspaceName;

            // Create a name object for the target dataset.
            IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
            IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
            targetDatasetName.Name = str_targetDatasetName;
            targetDatasetName.WorkspaceName = targetWorkspaceName;

            // Open source feature class to get field definitions.
            IName sourceName = (IName)sourceFeatureClassName;
            IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();

            // Create the objects and references necessary for field validation.
            IFieldChecker fieldChecker = new FieldCheckerClass();
            IFields sourceFields = sourceFeatureClass.Fields;
            IFields targetFields;
            IEnumFieldError enumFieldError;

            // Set the required properties for the IFieldChecker interface.
            fieldChecker.InputWorkspace = sourceWorkspace;
            fieldChecker.ValidateWorkspace = targetWorkspace;

            // Validate the fields and check for errors.
            fieldChecker.Validate(sourceFields, out enumFieldError, out targetFields);
            if (enumFieldError != null)
            {
                // Handle the errors in a way appropriate to your application.
                Console.WriteLine("Errors were encountered during field validation.");
            }

            IField geometryField;
            for (int i = 0; i < targetFields.FieldCount; i++)
            {
                if (targetFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
                {
                    geometryField = targetFields.get_Field(i);
                    //得到几何字段的几何定义                
                    IGeometryDef geometryDef = geometryField.GeometryDef;
                    //赋予几何定义一个空间索引格网数目和格网大小值
                    IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef;
                    targetFCGeoDefEdit.GridCount_2 = 1;
                    targetFCGeoDefEdit.set_GridSize(0, 0);
                    //允许ArcGIS为数据加载确定一个有效的格网大小
                    targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference;
                    //转换要素类中所有的要素
                    IQueryFilter queryFilter = serverContext.CreateObject("esriGeoDatabase.QueryFilter") as IQueryFilter;
                    queryFilter.WhereClause = "";
                    //加载要素类     
                    IFeatureDataConverter fctofc = serverContext.CreateObject("esriGeoDatabase.FeatureDataConverter") as IFeatureDataConverter;
                    IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName, geometryDef, targetFields, "", 1000, 0);
                    break;
                }
            }    
        }
注:这个方法中的IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName, geometryDef, targetFields, "", 1000, 0);这句报“值不在预期范围内”的错误,图件附件

//创建服务器上下文
public IServerContext GetServerContext()
        {
            #region 通过IGISServerConnection来创建服务器上下文
            IGISServerConnection gisServerConnection = new GISServerConnection();
            gisServerConnection.Connect("zhaofei-PC");
            IServerObjectManager4 serverObjectManager = (IServerObjectManager4)gisServerConnection.ServerObjectManager;
            IServerContext serverContext = serverObjectManager.CreateServerContext("", "");
            #endregion

            return serverContext;
        }
//获取sde空间
public IWorkspace FindWsByDefault()
        {
            IPropertySet propSet = new PropertySetClass();
            BusinessBase bb = new BusinessBase();
            propSet.SetProperty("Server", System.Net.Dns.GetHostName());
            propSet.SetProperty("Instance", "esri_sde");
            propSet.SetProperty("Database", "sde");
            propSet.SetProperty("User","wnwuser");
            propSet.SetProperty("Password", "wnwuser123456");
            propSet.SetProperty("Version","sde.DEFAULT");
            IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();
            IWorkspace workspace = factory.Open(propSet, 0);
            return workspace;
        }
//主方法
public static void showGishInMap(string shp_path,string layer_name)
        {
            ExportShapeFile importshape = new ExportShapeFile();
            string pFolder = esf.getNames(shp_path)[0].ToString();
            string pFileName = esf.getNames(shp_path)[1].ToString();
            IWorkspace pworkspace = FindWsByDefault();
            IServerContext serverContext = GetServerContext();
            ConvertShapefileToFeatureClass(serverContext,pFolder, pworkspace, "压力", "sde.DBO.esj_Junction");
ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);//局部刷新
        }

1.png

 
已邀请:

gisweis - GIS应用开发

赞同来自: why小飞

应该调试跟一下代码
这是我测试通过的代码:arcgis 10.0 sde  oracle 10g
        /// <summary>
///复制IFeatureClass(结构完全一致)
/// </summary>
/// <param name="pFromFeatureClass">源数据</param>
/// <param name="pToFeatureClass">目标数据</param>
public static void CopyFeatureClass(IFeatureClass pFromFeatureClass, IFeatureClass pToFeatureClass)
{
try
{
IFeatureCursor pFromFeatureCursor = pFromFeatureClass.Search(null, false);
IFeatureCursor pToFeatureCursor = pToFeatureClass.Insert(true);
IFeatureBuffer pFeatureBuffer = pToFeatureClass.CreateFeatureBuffer();
IFeature pFromFeature = pFromFeatureCursor.NextFeature();
while (pFromFeature != null)
{

//属性复制
for (int i = 0; i < pFromFeature.Fields.FieldCount; i++)
{
IField field = pFromFeature.Fields.Field[i];
int toIndex = pToFeatureClass.Fields.FindField(field.Name);
if (toIndex != -1)
{
IField tofield = pToFeatureClass.Fields.Field[toIndex];

if (tofield.Required) continue;
if (!tofield.Editable) continue;
object obj = pFromFeature.get_Value(i);
pFeatureBuffer.set_Value(toIndex, obj);
}
}


//形状复制
pFeatureBuffer.Shape = pFromFeature.Shape;
pToFeatureCursor.InsertFeature(pFeatureBuffer);

pFromFeature = pFromFeatureCursor.NextFeature();
pFeatureBuffer = pToFeatureClass.CreateFeatureBuffer();
}
pToFeatureCursor.Flush();

System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureBuffer);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pToFeatureCursor);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFromFeatureCursor);
}
catch (Exception ex)
{
LogHelper.Error(ex.Message + ex.StackTrace);
}
}

朱新颖

赞同来自:

ArcEngine什么版本啊?程序是初始化的EngineGDB许可吗?

要回复问题请先登录注册