| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Ср 27 Ноя 2013 14:38    Заголовок сообщения: SemData у MapObject | 
				     | 
			 
			
				
  | 
			 
			
				Здравствуйте!
 
Я начинаю свое знакомство с программированием в ИнГео, поэтому мой вопрос может показаться банальным.
 
 
Суть в следующем.
 
Например, у метода SetValue(...) объекта типа IIngeoSemData, который хранит семантические данные объекта карты, в качестве первого параметра указывается имя таблицы (Name). Но это имя таблицы не уникально. Можно создать несколько таблиц с одним именем. Каким образом мне различить таблицы с одинаковыми именами при записи данных? Перегрузки SetValue(...) для SemDbTableName ведь нет.
 
 
А вот имя столбца этому методу необходимо уникальное, соответствующее таблице БД. Но почему же имя таблицы требуется не из БД  | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Чт 28 Ноя 2013 18:02    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				В качестве имени таблицы можно указывать и условное имя таблицы и физическое имя таблицы в БД.
 
 
Кроме того, таблица с таким именем ищется только в рамках слоя, к которому относится объект. Как правило, в пределах слоя имена таблиц уникальные. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Пн 02 Дек 2013 09:27    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Спасибо! Но условное имя одной таблицы может совпадать с физическим именем другой таблицы. Как в этом случае поведет себя ИнГео? | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Пн 02 Дек 2013 11:22    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Николаускас писал(а): | 	 		  | Спасибо! Но условное имя одной таблицы может совпадать с физическим именем другой таблицы. Как в этом случае поведет себя ИнГео? | 	  
 
Выполняется поиск первой попавшейся таблицы слоя, у корой совпадает условное или физическое имя.
 
 
Еще раз повторю, что поиск выполняется только в рамках слоя (не БД).
 
 
Проблема может возникнуть, если в одном слое есть несколько таблиц с одинаковыми условными именами, либо условное имя одной из таблиц совпадает с физическим именем другой таблицы того же слоя. В этом случае будет использована первая попавшаяся таблица.
 
 
P.S. Поиск по имени не различает большие и маленькие буквы (регистрово-независим, case insensitive). _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Вт 03 Дек 2013 14:09    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Спасибо! Скажите, а, например, с GetValue и GetRecCount та же история?
 
 
UPD. Выяснил, что GetRecCount работает только с условным именем таблицы. Да и SetValue. Они требуют именно условное имя. Если подставляю физическое, то при попытке записи выскакивает исключение с сообщением о том, что таковой таблицы не найдено.
 
Что противоречит сказанному Вами. Версия 4.4.0.177.
 
Должно же быть какое-то средство абсолютно однозначно задать таблицу и поле для записи. Может быть какие-то альтернативы есть методам SetValue и GetRecCount? | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Чт 05 Дек 2013 13:58    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Николаускас писал(а): | 	 		  Спасибо! Скажите, а, например, с GetValue и GetRecCount та же история?
 
 
UPD. Выяснил, что GetRecCount работает только с условным именем таблицы. Да и SetValue. Они требуют именно условное имя. Если подставляю физическое, то при попытке записи выскакивает исключение с сообщением о том, что таковой таблицы не найдено.
 
Что противоречит сказанному Вами. Версия 4.4.0.177.
 
Должно же быть какое-то средство абсолютно однозначно задать таблицу и поле для записи. Может быть какие-то альтернативы есть методам SetValue и GetRecCount? | 	  
 
 
Да. В версии 4.4 поиск выполнялся только по условному имени.
 
 
В 4.6 (релиз-кандидат) поиск выполняется, как я написал выше.
 
 
А что вам мешает сделать условные имена таблиц уникальными внутри слоя? И пользователям так удобнее. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Чт 05 Дек 2013 14:10    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				А как я могу это сделать? Таблицы же создает пользователь вручную в GUI ИнГео. Он там может их хоть миллион одноименных насоздавать.
 
Что Вы имеете в виду?
 
 
У меня еще один вопрос. Метод SetValue в качестве второго параметра (имя поля) в v4.4 позволяет использовать, в отличие от имени таблицы (как мы уже выяснили), и условное имя поля и физическое. При этом сначала он (из моих наблюдений и экспериментов) ищет совпадения в физических именах, а уже потом - в условных. В связи с этим возникает вопрос. В версии 4.6 (RC) имя таблицы ищется тоже сначала в физических именах, а затем в условных или по какой-то другой схеме? И изменилась ли схема поиска имени поля в версии 4.6? | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Пт 06 Дек 2013 16:45    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Николаускас писал(а): | 	 		  А как я могу это сделать? Таблицы же создает пользователь вручную в GUI ИнГео. Он там может их хоть миллион одноименных насоздавать.
 
Что Вы имеете в виду? | 	  
 
Обычно структуру карты создает не обычный пользователь, а продвинутый, или, даже, администратор или программист. Обычным пользователям, обычно, даже прав таких не дают.
 
 
 	  | Николаускас писал(а): | 	 		  | У меня еще один вопрос. Метод SetValue в качестве второго параметра (имя поля) в v4.4 позволяет использовать, в отличие от имени таблицы (как мы уже выяснили), и условное имя поля и физическое. При этом сначала он (из моих наблюдений и экспериментов) ищет совпадения в физических именах, а уже потом - в условных. В связи с этим возникает вопрос. В версии 4.6 (RC) имя таблицы ищется тоже сначала в физических именах, а затем в условных или по какой-то другой схеме? И изменилась ли схема поиска имени поля в версии 4.6? | 	  
 
Думаю, в 4.6 сделаем такой алгоритм (одинаковый и для полей и для таблиц):
 
Сначала выполняется поиск по физическому имени (они всегда уникальны).
 
Затем, если не найдено, по логическому имени (заголовку). Если найдено более одного логического имени, то генерировать ошибку о неоднозначности имени. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Пт 06 Дек 2013 17:56    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Спасибо. А относительно GetRecCount все то же самое? | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Пн 09 Дек 2013 10:16    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Николаускас писал(а): | 	 		  | Спасибо. А относительно GetRecCount все то же самое? | 	  
 
Да _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Пн 09 Дек 2013 10:49    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Благодарю Вас за ответы. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Пн 09 Дек 2013 12:17    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Михаил, не хочу показаться назойливым, но у меня снова вопрос, и он имеет отношение к этой теме. 
 
Я заметил, что при удалении таблицы из слоя в GUI ИнГео сведения о ней в SemTables исчезают не сразу. Из СУБД таблица сразу исчезает, а вот если программно "спросить" layerView.Layer.SemTables, то там она еще "висит" некоторое время. Причем время это не одинаково каждый раз.
 
С чем это может быть связано? Конечно не исключаю, что такое поведение может быть результатом какой-нибудь моей ошибки, но я все проверил  | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Вт 10 Дек 2013 09:55    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Николаускас писал(а): | 	 		  Михаил, не хочу показаться назойливым, но у меня снова вопрос, и он имеет отношение к этой теме. 
 
Я заметил, что при удалении таблицы из слоя в GUI ИнГео сведения о ней в SemTables исчезают не сразу. Из СУБД таблица сразу исчезает, а вот если программно "спросить" layerView.Layer.SemTables, то там она еще "висит" некоторое время. Причем время это не одинаково каждый раз.
 
С чем это может быть связано? Конечно не исключаю, что такое поведение может быть результатом какой-нибудь моей ошибки, но я все проверил  | 	  
 
Вы правы - есть такой нюанс. Список сем.таблиц слоя не отражает удаления таблиц. Однако если освободить COM-экземпляр Layer.SemTables и взять его повторно, то новый список будет актуальным (без удаленной таблицы).
 
 
В 4.6 это исправлено.
 
 
P.S. Какая же тут назойливость? Для того форум и нужен, чтобы такие вопросы обсуждать. Так что пишите, спрашивайте. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Вт 10 Дек 2013 10:34    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Спасибо. Я не совсем понял насчет "освободить COM-экземпляр Layer.SemTables и взять его повторно". Никаких Dispose() и т.п. не нашел.
 
Я ищу слой по ID :  IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id); 
 
tempItem - это объект моего класса, идентифицирующий слой (одно из полей - ID).
 
То есть у меня имеется ComboBox, элементы которого - объекты моего типа. При выборе одного из элементов я проверяю, имеет ли выбранный слой таблицы с одинаковыми условными именами:
 
 
 	  | Код: | 	 		  
 
...
 
                ComboBoxUniqueIngeoItem tempItem = (ComboBoxUniqueIngeoItem)comboBox2.SelectedItem;
 
 
                IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id);
 
                
 
                bool isUnique = true;
 
                for (int i = 0; i < layerView.Layer.SemTables.Count; i++)
 
                {
 
                    for (int j = 0; j < layerView.Layer.SemTables.Count; j++)
 
                        if (layerView.Layer.SemTables[i].Name == layerView.Layer.SemTables[j].Name && i != j)
 
                        {
 
                            //  Одинаковые таблицы в слое
 
                            isUnique = false;
 
                            break;
 
                        }
 
                    if (!isUnique) break;
 
                }
 
 
if (!isUnique) // Сообщение о неуникальности имен таблиц
 
...
 
 | 	  
 
 
То есть в этом коде каждый раз заново получаю слой по ID. Но SemTables все равно хранит информацию об удаленной таблице. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Вт 10 Дек 2013 11:15    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Николаускас писал(а): | 	 		  Спасибо. Я не совсем понял насчет "освободить COM-экземпляр Layer.SemTables и взять его повторно". Никаких Dispose() и т.п. не нашел.
 
Я ищу слой по ID :  IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id); 
 
tempItem - это объект моего класса, идентифицирующий слой (одно из полей - ID).
 
То есть у меня имеется ComboBox, элементы которого - объекты моего типа. При выборе одного из элементов я проверяю, имеет ли выбранный слой таблицы с одинаковыми условными именами:
 
 
 	  | Код: | 	 		  
 
...
 
                ComboBoxUniqueIngeoItem tempItem = (ComboBoxUniqueIngeoItem)comboBox2.SelectedItem;
 
 
                IIngeoLayerView layerView = app.ActiveProjectView.FindLayerView(tempItem.Id);
 
                
 
                bool isUnique = true;
 
                for (int i = 0; i < layerView.Layer.SemTables.Count; i++)
 
                {
 
                    for (int j = 0; j < layerView.Layer.SemTables.Count; j++)
 
                        if (layerView.Layer.SemTables[i].Name == layerView.Layer.SemTables[j].Name && i != j)
 
                        {
 
                            //  Одинаковые таблицы в слое
 
                            isUnique = false;
 
                            break;
 
                        }
 
                    if (!isUnique) break;
 
                }
 
 
if (!isUnique) // Сообщение о неуникальности имен таблиц
 
...
 
 | 	  
 
 
То есть в этом коде каждый раз заново получаю слой по ID. Но SemTables все равно хранит информацию об удаленной таблице. | 	  
 
C#? COM-интероп невидимо и нежно держит ссылки на COM-объекты.
 
Попробуйте так:
 
 	  | Код: | 	 		  ...
 
IIngeoSemTables layerTables = layerView.Layer.SemTables;
 
try {
 
    bool isUnique = true;
 
    for (int i = 0; i < layerTables.Count; i++) {
 
        for (int j = 0; j < layerTables.Count; j++) {
 
            if (layerTables[i].Name == layerTables[j].Name && i != j) {
 
                //  Одинаковые таблицы в слое
 
                isUnique = false;
 
                break;
 
            }
 
        }
 
        if (!isUnique) break;
 
    }
 
}
 
finally {
 
    Marshal.ReleaseComObject(layerTables);
 
}
 
... | 	  
 
Должно помочь. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Вт 10 Дек 2013 14:10    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Спасибо! Работает  | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Николаускас
 
 
  Зарегистрирован: 27.11.2013 Сообщения: 52
 
  | 
		
			
				 Добавлено: Вт 10 Дек 2013 17:36    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Кстати, возвращаясь к той теме, я думаю, было бы лучше, если бы одним из параметров SetValue и подобных методов был флаг, определяющий, как будет выполняться поиск: по физическим именам; по условным именам; и по физическим, и по условным именам. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		 |