Имена столбцов в динамически генерируемых окнах данных
-
20-09-2019 - |
Вопрос
Когда я динамически создаю хранилище данных с помощью SyntaxFromSQL (чтобы сгенерировать исходный код хранилища данных на основе оператора SQL SELECT) с таким синтаксисом
string ERRORS, sql_syntax, dwsyntax_str, presentation_str
dwsyntax_str = trans_object.SyntaxFromSQL ( sql_syntax, presentation_str, ERRORS)
ds_1.Create( dwsyntax_str, ERRORS)
как я могу проверить имена сгенерированных столбцов хранилища данных ds_1
?Напоминаю вам, что в случае оператора выбора, который объединяет две или более таблиц, именам результирующих столбцов может предшествовать соответствующее имя таблицы, напримервместо получения имени столбца field_id
Я могу получить имя столбца, например: my_table_field_id
.Это вызывает проблемы, когда позже я указываю имя столбца (field_id
) в качестве аргумента GetItem
функция, в то время как соответствующее хранилище данных назвало столбец my_table_field_id
вместо.
Что еще хуже, я обнаружил, что одной из причин, по которой я получал разные определения столбцов (перед которыми стояло имя таблицы), был тот факт, что логину пользователя был назначен sa role
!?!?!
Решение
Обычно в вызовах Describe() вместо имени столбца можно использовать номер столбца, поэтому вы можете сделать что-то вроде:
string ls_FirstColumnName, ls_SecondColumnName
ls_FirstColumnName = dw_1.Describe ("#1.Name")
ls_SecondColumnName = dw_1.Describe ("#2.Name")
MessageBox ("Column Names", ls_FirstColumnName + "~r~n" + ls_SecondColumnName)
Кэшируйте значения или просто используйте номера столбцов в будущем.Большинство функций DataWindow/DataStore, ссылающихся на столбцы, имеют перегрузки, которые позволяют использовать целое число в качестве номера столбца, а не строку в качестве имени столбца.
Удачи,
Терри.
Другие советы
У меня была такая же проблема с SQL Anywhere 11, и я нашел несколько причин.
1) Если вы перестраиваете базу данных с помощью dbUnload, значение systab.creator может быть увеличено.В этом случае вы можете получить разные имена столбцов.
2) Когда пользователь, подключенный к базе данных, является владельцем таблиц (пользователь, создавший таблицы), я заметил, что получил my_table_field_id когда таблицы каталога pb (pbcatcol, pbcattab,...) уже были созданы в базе данных.