Код: Выделить всё
IFeatureClass featClass = featWorkspace.CreateFeatureClass(shpName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
Каким образом можно снять блокировку?имя_файла.shp.имя_компа.имя_процесса.lock
Геоинформационные системы (ГИС) и Дистанционное зондирование Земли
Код: Выделить всё
IFeatureClass featClass = featWorkspace.CreateFeatureClass(shpName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
Каким образом можно снять блокировку?имя_файла.shp.имя_компа.имя_процесса.lock
шейп-файл не многопользовательская БГД... редактор может быть только один. тот, кто первый создал файл получил эксклюзивную блокировку на редактирование. в любом случае 100500 пользователей (и даже 2) не смогут править один и тот же файл.а остальные копии просто пользовались им - подключали этот слой, удаляли на карте объекты слоя и создавали новые.
Код: Выделить всё
public void clearSetOfFeatures(string layerName)
{
ESRI.ArcGIS.Geodatabase.IQueryFilter qFilter = new ESRI.ArcGIS.Geodatabase.QueryFilter();
qFilter.WhereClause = "";
qFilter.SubFields = "Shape";
ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = null;
ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = getLayerByName(layerName) as ESRI.ArcGIS.Carto.IFeatureLayer;
ESRI.ArcGIS.Geodatabase.IFeatureCursor cursor = featureLayer.Search(qFilter, true);
featureClass = featureLayer.FeatureClass;
ESRI.ArcGIS.Geodatabase.ITable table = (ESRI.ArcGIS.Geodatabase.ITable)featureClass;
table.DeleteSearchedRows(qFilter);
}
должен. для этого надо прекратить редакторское подключение к файлуМне кажется процесс должен иметь возможность после создания шейп-файла снимать блокировку.
определяющий запрос и не надо ничего пересоздаватьСкажем - меня интересуют только события за сегодняшний день или за какой-то период.
с шейп-файлами одновременно правки будет вносить только один. то есть если открыта одна сессия редактировая - второй быть не может по определению.Любой пользователь, обладающий правами должен иметь возможность изменить состав шейп файла.
учитывая, что вы работаете с шейпом права пользователя будут определяться политикой доступа к файлам операционной системы (или домена, если папка с файлом - сетевая). то есть если пользователь может не входя в вашу систему открыть QGIS и сломать файл (или просто убить атрибуты, открыв таблицу dbf в Excel), то защита на уровне пароля в приложении, которое создаете вы - не более чем защита от дурака.Любой пользователь, обладающий правами
Код: Выделить всё
public void createShpFile(string shpName, DataTable dataTable)
{
//++++++++++++++ Create a new Shapefile with given name +++++++++++++++++++++++++++
//Get the factory
ShapefileWorkspaceFactory factory = new ShapefileWorkspaceFactory();
//Create a workspace
IWorkspaceName workspaceName = factory.Create(parentDirectory, catalogName, null, 0);
IName name = workspaceName as IName;
//QI to IFeatureWorkspace
IFeatureWorkspace featWorkspace = (IFeatureWorkspace)name.Open();
// Create a Fields collection to describe the fields of the new feature class.
IFields fields = new Fields();
IFieldsEdit fieldsEdit = fields as IFieldsEdit;
// Add an "OBJECTID" field (feature classes must have this!)
IField oidField = new Field();
IFieldEdit oidFieldEdit = oidField as IFieldEdit;
oidFieldEdit.Name_2 = "OBJECTID";
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
fieldsEdit.AddField(oidField);
// Create a geometry definition object describing the geometries
ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironmentClass();
IGeographicCoordinateSystem gcs = srFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
IProjectedCoordinateSystem pcs = srFactory.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_Pulkovo1942GK_6);
IGeometryDef geometryDef = new GeometryDef();
IGeometryDefEdit geomDefEdit = geometryDef as IGeometryDefEdit;
geomDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
geomDefEdit.SpatialReference_2 = pcs;
// Add the "Shape" field that will be storing the geometry of each feature
IField shpField = new Field();
IFieldEdit shpFieldEdit = shpField as IFieldEdit;
shpFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
shpFieldEdit.Name_2 = "Shape";
shpFieldEdit.GeometryDef_2 = geomDefEdit;
fieldsEdit.AddField(shpField);
esriFieldType fieldType;
int fieldLength;
int i = 0;
foreach (DataColumn col in dataTable.Columns)
{
IField aField = new Field();
IFieldEdit aFieldEdit = aField as IFieldEdit;
getFieldType(col, out fieldType, out fieldLength);
//if (i == 0)
// aFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
//else
aFieldEdit.Type_2 = fieldType;//esriFieldType.esriFieldTypeString
string colName = col.ColumnName;
if (colName.ToLower() == "площадь_нелесной_зоны")
colName = "ПлощадьНелеснойЗоны";
else if (colName == "код_пожара_сзбаол")
continue;// colName = "кодПожаразбаол";
else if (colName == "код_района_сзбаол")
continue;//
aFieldEdit.Name_2 = colName;
aFieldEdit.Length_2 = fieldLength;
fieldsEdit.AddField(aField);
i++;
}
//Create FeatureClass
IFeatureClass featClass = featWorkspace.CreateFeatureClass(shpName, fields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
}
Код: Выделить всё
System.Runtime.InteropServices.Marshal.ReleaseComObject(featClass);
sr locks are schema locks. So just opening the shapefile will create a schema lock no edits necessary. You need to explicitly release any references to the featureclass and workspace using the comreleaser. It is a bit of a needle in a hay stack to find them all though. It is the only way I know how to do it. I remember once having to wade through thousands of lines of code to do it, the only way was to set break points, monitor the locks and comment out section by section of code.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя
© GIS-Lab и авторы, 2002-2017. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).