Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Николаускас
Зарегистрирован: 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 и подобных методов был флаг, определяющий, как будет выполняться поиск: по физическим именам; по условным именам; и по физическим, и по условным именам. |
|
Вернуться к началу |
|
 |
|