using System;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geometry;
using System.Runtime.InteropServices;
namespace ZSoft.GIS.ADF.GISCore
{
public class SDETool:IDisposable
{
//工作空间
private ESRI.ArcGIS.Geodatabase.IWorkspace m_pWorkspace = null;
private bool m_connected = false;
public bool Connected
{
get { return m_connected; }
set { m_connected = value; }
}
//链接SDE
public bool ConnectSDE(string strServer, string strUserName, string strPassword, string strInstance, string strDatabase, string strVersion)
{
IWorkspaceFactory2 pWorkspaceFactory = null;
IPropertySet pConnectionProperties = new PropertySetClass();
try
{
pWorkspaceFactory = new SdeWorkspaceFactoryClass();
pConnectionProperties.SetProperties("SERVER", strServer);
pConnectionProperties.SetProperties("USER", strUserName);
pConnectionProperties.SetProperties("PASSWORD", strPassword);
pConnectionProperties.SetProperties("INSTANCE", strInstance);
pConnectionProperties.SetProperties("DATABASE", strDatabase);
pConnectionProperties.SetProperties("VERSION", strVersion);
pConnectionProperties.SetProperties("DATABASE", strDatabase);
m_pWorkspace = pWorkspaceFactory.Open(pConnectionProperties, 0);
m_connected = true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
m_connected = false;
}
return m_connected;
}
//创建SDE图层
public IFeatureLayer CreateSDELayer(string DataSetName, string AliaseName, int GeometryType, List<string> strFldsInfo)
{
//检查SDE是否连接
if (m_connected == false)
return null;
//IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
//IFeatureWorkspace inmemWor = (IFeatureWorkspace)workspaceFactory.OpenFromFile("c://", 0);
IFields oFields = new FieldsClass();
IFieldsEdit oFieldsEdit = oFields as IFieldsEdit;
IFeatureClass oFeatureClass = null;
IFeatureLayer oFeatureLayer = null;
try
{
//增加string类型字段
IField oField = new FieldClass();
IFieldEdit oFieldEdit = oField as IFieldEdit;
oFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
oFieldEdit.Name_2 = "MiscText";
oFieldEdit.Length_2 = 30;
oFieldsEdit.AddField(oField);
//增加形体定义字段
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.GeometryType_2 = (esriGeometryType)GeometryType;
//geometryDefEdit.SpatialReference_2 = new UnknownCoordinateSystemClass();
ISpatialReferenceFactory2 pSpaRefFact2 = new SpatialReferenceEnvironmentClass();
IGeographicCoordinateSystem pGeoCoordSys = pSpaRefFact2.CreateGeographicCoordinateSystem(4326);
ISpatialReference pSpatialReference = (ISpatialReference)pGeoCoordSys;
ISpatialReferenceResolution pSpatialReferenceResolution = (ISpatialReferenceResolution)pSpatialReference;
pSpatialReferenceResolution.ConstructFromHorizon();
geometryDefEdit.SpatialReference_2 = pSpatialReference;
oField = null;
oField = new FieldClass();
oFieldEdit = oField as IFieldEdit;
oFieldEdit.Name_2 = "SHAPE";
oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
oFieldEdit.GeometryDef_2 = geometryDef;
oFieldEdit.IsNullable_2 = true;
oFieldEdit.Required_2 = true;
oFieldsEdit.AddField(oField);
oFeatureClass = (m_pWorkspace as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
oFeatureLayer = new FeatureLayerClass();
oFeatureLayer.Name = AliaseName;
oFeatureLayer.FeatureClass = oFeatureClass;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
return null;
}
finally {
try
{
Marshal.ReleaseComObject(oFieldsEdit);
Marshal.ReleaseComObject(oFeatureClass);
}
catch { }
GC.Collect();
}
return oFeatureLayer;
}
//删除SDE图层
public bool DeleteSDELayer(string SDEDSname)
{
try
{
IEnumDatasetName pEnumDsName = m_pWorkspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass);
pEnumDsName.Reset();
IDatasetName pSDEDSname = pEnumDsName.Next();
while (pSDEDSname != null)
{
if (pSDEDSname.Name.ToUpper() == SDEDSname.ToUpper())
{
break;
}
pSDEDSname = pEnumDsName.Next();
}
if (pSDEDSname != null)
{
IFeatureWorkspace pFWS = m_pWorkspace as IFeatureWorkspace;
IFeatureWorkspaceManage pFWSM;
pFWSM = (IFeatureWorkspaceManage)pFWS;
pFWSM.DeleteByName(pSDEDSname);
}
}
catch (Exception ex)
{
return false;
}
return true;
}
#region IDisposable 成员
public void Dispose()
{
if( m_pWorkspace != null )
Marshal.ReleaseComObject(m_pWorkspace);
}
#endregion
}
}