//将上传的mdb文件保存至sde数据库中
   protected void btnSaveToSDE_Click(object sender, EventArgs e)
   {
       //获取服务器上下文
       IServerContext serverContext = GetServerContext();

       //打开mdb文件所在的工作空间
       ESRI.ArcGIS.Geodatabase.IWorkspaceFactory wf = serverContext.CreateObject("esriDataSourcesGDB.AccessWorkspaceFactory") as IWorkspaceFactory;
       string fileName = @"F:\MyGeodatabase.mdb";
       IFeatureWorkspace pFeatureWorkspaceMDB = wf.OpenFromFile(fileName, 0) as IFeatureWorkspace;
       IWorkspace pWorkspaceMDB = pFeatureWorkspaceMDB as IWorkspace;

      //打开sde空间数据库的工作空间
       IFeatureWorkspace pFeatureWorkspaceSDE = OpenWorkspace(serverContext);
       IWorkspace pWorkspaceSDE = pFeatureWorkspaceSDE as IWorkspace;

       #region //获得mdb所有的要素数据集并进行转换复制
       IEnumDataset pEnumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureDataset);
       IDataset pDataset = pEnumDataset.Next();

      //遍历mdb中每一个数据集
       string nameOfSourceFeatureDataset = null;//源数据集名称
       string nameOfTargetFeatureDataset = null;//目标数据集名称
       while (pDataset != null)
       {
           nameOfSourceFeatureDataset = pDataset.Name;
           nameOfTargetFeatureDataset = nameOfSourceFeatureDataset + "_SDE";
           ConvertMDBFeatureDatasetToSDE(serverContext, pWorkspaceMDB, pWorkspaceSDE, nameOfSourceFeatureDataset, nameOfTargetFeatureDataset);
           pDataset = pEnumDataset.Next();
       }
       #endregion

       #region //获得mdb中所有的独立要素类并进行转换复制
       IEnumDataset enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureClass) as IEnumDataset;
       IDataset dataset = enumDataset.Next();

       //遍历mdb的每一个独立要素类
       string nameOfSourceFeatureClass = null;//源要素类名称
       string nameOfTargetFeatureClass= null;//目标要素类名称
       while (dataset != null)
       {
           if (dataset.Type == esriDatasetType.esriDTFeatureClass)
           {
               IFeatureClass pFeatureClass = dataset as IFeatureClass;
               nameOfSourceFeatureClass = pFeatureClass.AliasName;
               nameOfTargetFeatureClass = nameOfSourceFeatureClass + "_SDE";
               ConvertMDBFeatureClassToSDE(serverContext, pWorkspaceMDB, pWorkspaceSDE, nameOfSourceFeatureClass, nameOfTargetFeatureClass);
               dataset = enumDataset.Next();
           }
           else
           {
               return;
           }
       }
       #endregion

      //释放服务器上下文
       serverContext.ReleaseContext();
   }

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

       return serverContext;
   }

//打开sde数据库

public IFeatureWorkspace OpenWorkspace(IServerContext serverContext)
{
     //sde数据库连接属性设置
    IPropertySet pProperty = serverContext.CreateObject("esriSystem.PropertySet") as IPropertySet;
    pProperty.SetProperty("Server", "fms");//服务器名称或者IP
    pProperty.SetProperty("Instance", "esri_sde");//
    pProperty.SetProperty("Database", "sde数据库名");//sde数据库名称
    pProperty.SetProperty("user", "用户名");//用户名称
    pProperty.SetProperty("password", "密码");//用户密码
    pProperty.SetProperty("version", "sde.DEFAULT");//连接版本

    //创建IWorkspaceFactory对象
    ESRI.ArcGIS.Geodatabase.IWorkspaceFactory2 wf = serverContext.CreateObject("esriDataSourcesGDB.SdeWorkspaceFactory") as IWorkspaceFactory2;
    //打开IFeatureWorkspace对象
    IFeatureWorkspace fws = wf.Open(pProperty, 0) as IFeatureWorkspace;

    return fws;
}

//将mdb中的要素数据集转换到sde数据库中
    public void ConvertMDBFeatureDatasetToSDE(IServerContext serverContext,IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureDataset, string nameOfTargetFeatureDataset)   
    {
        if (sourceWorkspace == null || targetWorkspace == null)
        {
            return;
        }
        //创建源工作空间名     
        IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;       
        IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;
        //创建源数据集名
        IFeatureDatasetName sourceFeatureDatasetName = serverContext.CreateObject("esriGeoDatabase.FeatureDatasetName") as IFeatureDatasetName;
        IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureDatasetName;       
        sourceDatasetName.WorkspaceName = sourceWorkspaceName;       
        sourceDatasetName.Name = nameOfSourceFeatureDataset;
        //创建目标工作空间名
        IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;       
        IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
       //创建目标数据集名
        IFeatureDatasetName targetFeatureDatasetName = serverContext.CreateObject("esriGeoDatabase.FeatureDatasetName") as IFeatureDatasetName;
        IDatasetName targetDatasetName = (IDatasetName)targetFeatureDatasetName;       
        targetDatasetName.WorkspaceName = targetWorkspaceName;       
        targetDatasetName.Name = nameOfTargetFeatureDataset;
        //转换(复制)源数据集到目标数据集
        IFeatureDataConverter featureDataConverter = serverContext.CreateObject("esriGeoDatabase.FeatureDataConverter") as IFeatureDataConverter;
        featureDataConverter.ConvertFeatureDataset(sourceFeatureDatasetName, targetFeatureDatasetName, null, "", 1000, 0);       

    }

//将mdb中要素类转换复制到sde数据库中

   public void ConvertMDBFeatureClassToSDE(IServerContext serverContext,IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureClass, string nameOfTargetFeatureClass)   
    {       
        // 创建源工作空间名称    
        IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;       
        IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;

       //创建源数据集名称       
        IFeatureClassName sourceFeatureClassName = serverContext.CreateObject("esriGeoDatabase.FeatureClassName") as IFeatureClassName;
        IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;       
        sourceDatasetName.WorkspaceName = sourceWorkspaceName;       
        sourceDatasetName.Name = nameOfSourceFeatureClass;

      //创建目标工作空间名称   
        IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;       
        IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;

       //创建目标数据集名称   
        IFeatureClassName targetFeatureClassName = serverContext.CreateObject("esriGeoDatabase.FeatureClassName") as IFeatureClassName;
        IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;       
        targetDatasetName.WorkspaceName = targetWorkspaceName;       
        targetDatasetName.Name = nameOfTargetFeatureClass;

       //打开输入的要素类以得到字段定义     
        ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName;       
        IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();//打开源要素类

       //验证字段名称,因为你正在不同类型的工作空间之间进行数据转换
        IFieldChecker fieldChecker = serverContext.CreateObject("esriGeoDatabase.FieldChecker") as IFieldChecker;       
        IFields sourceFeatureClassFields = sourceFeatureClass.Fields;
        IFields targetFeatureClassFields;       
        IEnumFieldError enumFieldError;

       //最重要的设置输入和验证工作空间
        fieldChecker.InputWorkspace = sourceWorkspace;       
        fieldChecker.ValidateWorkspace = targetWorkspace;       
        fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields);

       //遍历所有输出字段找到几何字段
        IField geometryField;       
        for (int i = 0; i < targetFeatureClassFields.FieldCount; i++)       
        {           
            if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)           
            {               
                geometryField = targetFeatureClassFields.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, targetFeatureClassFields, "", 1000, 0);               
                break;           
            }       
        }   
    }

posted on 2009-08-12 21:57  冯淼森  阅读(3013)  评论(2编辑  收藏  举报