//将上传的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;
}
}
}