CreateFeatureClass COM异常

private static IFeatureClass CreatStnShp(string shp)
        {
            //打开工做空间
            IWorkspaceFactory wsfactory = new ShapefileWorkspaceFactoryClass();
            string ssss = System.IO.Path.GetDirectoryName(shp);
            IWorkspace workspace = wsfactory.OpenFromFile(ssss, 0);
            IFeatureWorkspace pFeatWsp = workspace as IFeatureWorkspace;
            
            if (File.Exists(shp))
            {
                DialogResult dr = MessageBox.Show("文件已经存在,是否使用该文件?", "提示",
                    MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if ( dr== DialogResult.Yes)
                {
                    return pFeatWsp.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shp));
                }
                else if(dr==DialogResult.No)
                {
                    //删除已有
                    DialogResult ddr = MessageBox.Show("是否删除并替换已有文件", "提示",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (ddr == DialogResult.Yes)
                    {
                        string dbffile = System.IO.Path.ChangeExtension(shp, ".dbf");
                        string shxfile = System.IO.Path.ChangeExtension(shp, ".shx");
                        string prjfile = System.IO.Path.ChangeExtension(shp, ".prj");
                        File.Delete(shp);
                        if (File.Exists(dbffile))
                            File.Delete(dbffile);
                        if (File.Exists(shxfile))
                            File.Delete(shxfile);
                        if (File.Exists(prjfile))
                            File.Delete(prjfile);
                    }
                    else
                    {
                        MessageBox.Show("请从新选择shapfile文件的路径");
                    }
                }
                else
                {
                    return null;
                }
            }

            IGeometryDefEdit pGeoDef = new GeometryDefClass();
            pGeoDef.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            
            //设置空间参考
            ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
            ISpatialReference pSr = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

            //设置字段
            IFieldEdit pField;
            IFieldsEdit pFieldsEdit = new FieldsClass();
            //设置几何字段
            pField = new FieldClass();
            pField.Type_2 = esriFieldType.esriFieldTypeGeometry;
            pField.GeometryDef_2 = pGeoDef;
            pField.Name_2 = "Shape";
            pFieldsEdit.AddField(pField);
            //产生惟一索引字段
            pField = new FieldClass();
            pField.Name_2 = "OBJECTID";
            pField.Type_2 = esriFieldType.esriFieldTypeOID;
            pFieldsEdit.AddField(pField);
            //添加station相关字段
            //string[] str = new string[]{"NCDCID","WBAN","NAME","COOPID","COUNTRY","STNTYPE"};
            string[] str = new string[] { "WBAN", "NAME", "LOCATION", "LAT", "LON"};
            foreach (string stt in str)
            {
                pField = new FieldClass();
                pField.Name_2 = stt;
                pField.AliasName_2 = stt;
                pField.Type_2 = esriFieldType.esriFieldTypeString;
                if (stt == "LOCATION")
                    pField.Length_2 = 60;
                else
                    pField.Length_2 = 30;
                pFieldsEdit.AddField(pField);
            }
            pField = new FieldClass();
            pField.Name_2 = "StnHeight";
            pField.Type_2 = esriFieldType.esriFieldTypeDouble;
            pFieldsEdit.AddField(pField);

            pField = new FieldClass();
            pField.Name_2 = "GndHeight";
            pField.Type_2 = esriFieldType.esriFieldTypeDouble;
            pFieldsEdit.AddField(pField);

            IFeatureClass pfeatcls =pFeatWsp.CreateFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shp), pFieldsEdit as IFields, null, null, 
                esriFeatureType.esriFTSimple, "Shape", "");
            IGeoDataset pGeoDs = pfeatcls as IGeoDataset;
            IGeoDatasetSchemaEdit pGeoDSe = pGeoDs as IGeoDatasetSchemaEdit;
            if (pGeoDSe.CanAlterSpatialReference)
            {
                pGeoDSe.AlterSpatialReference(pSr);
            }

            return pfeatcls;
        }

 上面是可正常运行的代码。本身写的时候凭着本身的理解作了部分修改,在字段声明的时候略有不一样,以下spa

IFields pfs = new FieldsClass();
                IFieldsEdit pFieldsEdit = pfs as IFieldsEdit;
                IField pFieldd = new FieldClass();
                IFieldEdit pField = pFieldd as IFieldEdit;

 结果在运行的时候出现COM异常,仔细核查了CreateFeatureClass的每一个参数,屡次检查都没有查到结果。后来修改成文中第一段代码声明方式,再运行成功了。blog

为了找出错误,我又把声明换回第二段代码,使人郁闷的是,又没异常了。索引

 

本文只描述现象,不解释缘由string

相关文章
相关标签/搜索