环境说明
使用Arcgis Engine 10.3.0.0 把本地cad文件导入到sql矢量数据库(修改表中字段值) demo
连接sde配置
IPropertySet pPropertySet = new PropertySet();
pPropertySet.SetProperty("SERVER", "0.0.0.0");
pPropertySet.SetProperty("INSTANCE", "sde:sqlserver:0.0.0.0");
pPropertySet.SetProperty("DATABASE", "");
pPropertySet.SetProperty("USER", "");
pPropertySet.SetProperty("PASSWORD", "")
IWorkspaceFactory2 workspaceFactory = new SdeWorkspaceFactoryClass();
IWorkspace sdeWorkspace = workspaceFactory.Open(pPropertySet, 0);
打开本地cad文件
注意先打开工作空间目录,在打开具体的文件。
String nameOfPath = @"E:\data\cad\";
String nameOfCADFile = "demo.DWG";
//Set the Workspace Factory.
IWorkspaceFactory pWorkspaceFact = new CadWorkspaceFactory();
//Open the workspace.
IWorkspace pWorkspace = pWorkspaceFact.OpenFromFile(nameOfPath, 0);
导入数据(修改表中字段值)
1.IFeatureClass.CreateFeatureBuffer配合insert cursor使用。不会触发事件,该方法常常用来一次性插入大量要素,比第一种方法效率高很多。此外,IFeatureClass.Insert(bool useBuffering)方法中参数useBuffering建议总将其设为true,这样数据会先缓冲在客户端,然后执行Flush时批量写入,以提升效率。
2.这里提一下,该方法中涉及到cursor的释放,有两种方法释放游标:
a, 直接使用ComReleaser.ReleaseCOMObject(cursor); 或者Marshal.FinalReleaseComObject(cursor);
b, 使用using(){ }方式,如下:
(执行完using后会自动释放insertCursor和featureBuffer,可以避免程序比较复杂时不确定在哪释放或者忘记释放的情况,是比较优秀的编程方式,推荐使用。)
插入数据参考:https://blog.csdn.net/xinying180/article/details/56486624
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
IFeatureWorkspace sdeFeatureWorkspace = (IFeatureWorkspace)sdeWorkspace;
//选择cad中类型为点的featureClass
FeatureClass pFeatClass = pFeatureWorkspace.OpenFeatureClass(System.String.Concat(nameOfCADFile, ":Point"));
IQueryFilter pFilter = new QueryFilter();
string cadLayer = "图层名称";
string where = string.Format("Layer='{0}'", cadLayer);
pFilter.WhereClause = where;
//记录总数
int count = pFeatClass.FeatureCount(pFilter);
IFeatureCursor cadFeatureCursor = pFeatClass.Search(pFilter, true);
IFeature pCadFeature;
//打开sde featureClass
IFeatureClass featureClass = sdeFeatureWorkspace.OpenFeatureClass("要素名称");
//导入
using (ComReleaser comReleaser = new ComReleaser())
{
IFeatureCursor featureCursor = featureClass.Insert(true);
while ((pCadFeature = cadFeatureCursor.NextFeature()) != null)
{
IGeometry pGeometry = pCadFeature.Shape as IGeometry;
IZAware pLineZ = pGeometry as IZAware;
pLineZ.ZAware = false;
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
featureBuffer.Shape = pGeometry;
//修改表字段值
//int findex = featureClass.FindField("test");
//featureBuffer.set_Value(findex, "test");
featureCursor.InsertFeature(featureBuffer);
}
comReleaser.ManageLifetime(featureCursor);
}