研究了一天shape图层导入数据库,现将实现代码及注意事项整理如下:
//引用
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Controls;
//调用方法
public void ShapefileImportDB()
{
//将要导入数据库的shape图层添加到mapControl
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + @"data\Intersect";
m_mapControl.AddShapeFile(filePath, "intersect.shp");
//设置数据库连接字符串(此处采用的是Oracle数据库,其他数据库大同小异,未加以验证)
IPropertySet pPropertySet = new PropertySet();
pPropertySet.SetProperty("Data Source", "192.168.34.54\\orcl");
pPropertySet.SetProperty("User ID", "zsdz");
pPropertySet.SetProperty("Password", "Zs123456");
//pPropertySet.SetProperty("version", "SDE.DEFAULT");
IFeatureLayer m_featureLayer = m_mapControl.get_Layer(0) as IFeatureLayer;
IFeatureClass m_featureClass = m_featureLayer.FeatureClass;
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.Open(pPropertySet, 1);
int code = getSpatialReferenceCode(m_featureClass);//
string datasetName = m_featureClass.AliasName;
//删除数据库中原有的相同的要素类(因为我的写程序要定时将新生成的shape图层更新到数据库,所以要先对数据库原有的要输类进行删除)
DeleteFeatureDataset(pWorkspace, "ZSQYFJ_PY");
//根据名称获取要素集(若数据库中存在该名称的要素集,则获取;若无,新建)
IFeatureDataset pFeatureDataset = getFeatureDataset(pWorkspace, "QYFJ");
if (pFeatureDataset == null)
{
pFeatureDataset = CreateFeatureClass(pWorkspace, code, "QYFJ");
}
//得到数据集后,将要素类导入数据库
importToDB(m_featureClass, pWorkspace, pFeatureDataset, "ZSQYFJ_PY");
}
//获取数据库中的要素集
private IFeatureDataset getFeatureDataset(IWorkspace pWorkspace, string datasetName)
{
IFeatureDataset pFeatureDataset = null;
IEnumDataset pEnumDataset=pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
pEnumDataset.Reset();
IDataset pDataset = pEnumDataset.Next();
while (pDataset != null)
{
if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)
{
&nb