проблема с feature.Store()

0 голосов
спросил 18 Май, 10 от boom (1,760 баллов) в категории Программные продукты Esri
Здравствуйте!
на компе у меня стоит arcgis 9.3, мне нужно было сделать редактирование поля в слое, сделал так
muWorkspaceEdit.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMVersioned);
workspaceEdit.StartEditOperation();

m_FCursor = m_featureclass.Update(null, true);
feature = m_FCursor.NextFeature();
feature.set_Value(indexEditField, editValue);
feature.Store();

workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);

проверил программку в базе 9.3. работает, редактирует и сохраняет, все нормально.

теперь надо, чтобы она работала и с базой 9.0. проверяю ее же на 9.0, редактирует, после Store() делаю feature.get_Value(indexEditField). выводит новое значение. но после обработки всех значений cursor'a, значения пропадают, т.е. новые значения не сохраняются.

в чем может быть проблема? в разнице версий? если в ней, то надо ставить 9.0, тулкит для 9.0 и писать там?


16 Ответы

0 голосов
ответил 18 Май, 10 от pooperec (10,820 баллов)
Проблема версий, попробуйте ещё через курсор.
Если база сетевая (ArcSDE), то ставьте Direct Connect с соответствующей совместимостью (но на счёт поддержки версии 9.0 - не уверен)...
    
0 голосов
ответил 18 Май, 10 от boom (1,760 баллов)
так я вроде и так делаю через курсор
IFeatureCursor m_FCursor;
m_FCursor = m_featureclass.Update(null, true);
feature = m_FCursor.NextFeature();
...
или вы имеете ввиду чтото другое?

попробую Direct Connect...
а в какой момент вносятся изменения в базу? когда заканчивается редактирование (StopEditing)?
0 голосов
ответил 18 Май, 10 от pooperec (10,820 баллов)
boom

Обратил внимание на Ваш код.

0. У Вас в редактируемом слое нету Топологий, он не версионный? Редактирование идёт в сетевой БД?
1. Попробуйте так (без стар стопа едит сессии):
var
pFeatureLayer : IFeaturelayer;
pFeature      : IFeature;
pGeometry     : IGeometry;
Begin
//Что-то делаем для получения слоя и геометрии...

pFeature := pFeatureLayer.FeatureClass.CreateFeture;
pFeature.Value[3]:='Заполняем какое-то поле';
pFeature.Shape   := pGeometry; //Заполняем геометрию
pFeature.Store; //Сохраняем


End;
0 голосов
ответил 18 Май, 10 от boom (1,760 баллов)
я привел не весь код, да, не версионный. Установил DirectConnect, помогло, но частично, приведу пример.
есть табличка, пусть там 20 строк, objectid от 1 до 20,
есть одно пустое поле, т.е. все значения = null
делаю
m_FCursor = m_featureclass.Search(null, true);
или
m_FCursor = m_featureclass.Update(null, true);
для поиска null
находит, но почему то 1 и 10 пропускает (а если в таблице 20000 строк, то пятая часть строк остается = null)
0 голосов
ответил 18 Май, 10 от pooperec (10,820 баллов)
О__О

Для поиска пустых значений по полю Вы должны сначала создать объект имплементирующий интерфейс IQueryFilter, а не передавать null (аналог nil, я так понимаю в Делфи).

Код примерно такой:
pQueryFilter := CoQueryFilter.Create as IQueryFilter;
//или pQueryFilter := CreateCOMObject(CLSID_QueryFilter) //as IQueryFilter;
pQueryFilter.WhereClause := 'Имя_поля is null'

//А дальше Ваше
m_FCursor := m_featureclass.Search(pQueryFilter, true);
///
0 голосов
ответил 18 Май, 10 от boom (1,760 баллов)
спасибо, а если мне надо будет найти не только пустые значения, то в фильтре как объединяются эти критерии? амперсантом (&) или and?
если в курсоре писать search(null, true) то он же должен все значения найти, не так ли?
0 голосов
ответил 18 Май, 10 от pooperec (10,820 баллов)
Да, если в фильтре nil, то он находит все значения.
Если нужно объединить, то юзайте AND.
Пример:
(Поле_1 is not null) AND ((Поле_2 =2) OR (Поле_2 =3))
0 голосов
ответил 18 Май, 10 от boom (1,760 баллов)
понял, спасибо
0 голосов
ответил 20 Май, 10 от boom (1,760 баллов)
сейчас обнаружил, что данные то редактируются, но в таблице A... (смотрю в базе оракл) при каждом редактировании добавляется строчка с новым значением, т.е. старые не удаляются, например было значение d поле num = 100 у objectid = 1, правлю num на 3, в итоге появляются 2 строчки 1, 100 и 1, 3 с разными sde_state_id и в самой таблице (например слой sde.lots, таблица lots) поле которое правлю не меняется, все изменения видны только если открывать таблицу аттрибутов в аркмапе

вроде сделал все правильно

 muWorkspaceEdit.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMVersioned);
m_FCursor = m_featureclass.Update(null, true);
m_FCursor = m_featureclass.Update(query, true);
...
workspaceEdit.StartEditOperation();
  try
  {
    feature = m_FCursor.NextFeature();
    if (feature == null) break;
    object ob = feature.get_Value(indexEditField);
   if (ob == null || ob.ToString() == "" || ob.ToString() == "0")
    {
     if (editValue != "")
       {
         feature.set_Value(indexEditField, editValue);
         feature.Store();
       }
     }
   }
 catch (Exception e) { Console.WriteLine("Error: " + e.Message); }

 bool hasEdits = false;
 workspaceEdit.HasEdits(ref hasEdits);
 workspaceEdit.StopEditOperation();

 workspaceEdit.StopEditing(true);


или может еще чего то не хватает? а то если будут постоянно добавляться лишние строчки, ет ж очень плохо((
0 голосов
ответил 20 Май, 10 от pooperec (10,820 баллов)
Так, ещё раз сначала... Данные ТОЧНО не версионные?
Просмотр через АркГИС что показывает?
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...