![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка наличия поля в таблице. [D7, XP]
vegarulez © (2011-11-09 23:34:00)Буэнос диас, комрады!
Подскажите такой вопрос - как проверить наличие поля в таблице и если его нет то создать, если есть то просто продолжить работу.
использую *.mdb + zquery
проверяю наличия поля в таблице через
Zquery1.SQL.Text:='Select xml_2 from cfg where 1';
Zquery1.Open;
if not (Zquery1.FieldCount>0) then
Begin
...
End;
но вот беда если поля в таблице нет то запрос вываливается в эксцепшн (
как более правильно проверять такие вещи и создавать поля если их нет.
MsGuns (2011-11-10 11:07:00) [1]Попробую предложить 5-й, "загадочный" вариант.
Вернее не вариант, а скорее соялнка из предложенного ранее.
Во-первых, непременно разделить весь функционал (читай-программу) на 2 части 1) Верификация + апдэйт по стандартной схеме, на которую тут намекает Inovet ©
2) - Собственно пользовательское приложение, которое работает с базой, преполагая, что она уже приведена к нужной версии.
Схему (инструкцию) по апдэйтам, мне кажется, расписывать не нужно, Вы сами вполне сообразите.
По коду несколько замечаний
1) Плохо, когда в OnCreate запихивают кучу вещей, которые могут вовсе не пригодиться при работе с программой (например, создание датамодулей и форм, которые юзер ни разу даже не откроет), совсем плохо, когда туду еще суют "базовые" (т.е. потенциально опасные) штучки (логин, открытие таблиц и запросов), и совсем уже хреново, если туда умудряются вмантулить код, меняющий СТРУКТУРУ базы данных.
Выносите все это куданить в другие места, более контекстно уместные, например открытие базы (и соотв.таблиц) по кнопке или при активации соотв.формы
2) try except/finally придумали именно для того, чтобы дать программисту возможность отреагировать на независящее от него событие вместе (а иногда и ВМЕСТО) со средой. Любые действия с базой данных относятся к потенциально опасному коду и в ХОРОШЕЙ программе должны соотв.бразом "предохраняться". Будете Вы это делать или нет - дело в конечном счете Ваше.
3) Избежать "километров" кода очень легко, используя нехитрые приемы, например вынося "за скобки" повторяющийся код.
Плохиш (2011-11-10 11:02:00) [2]Я тащусь от отвечающих :-)) можно подумать, что они ник топикстартера первый раз видят.
Smile (2011-11-10 09:31:00) [3]
ADOQuery1.FieldDefList.Text;// список полей выбранной таблицы
Anatoly Podgoretsky (2011-11-10 08:43:00) [4]> vegarulez (10.11.2011 01:09:20) [20]
INFORMATION_SCHEMA
Anatoly Podgoretsky (2011-11-10 08:42:00) [5]> vegarulez (10.11.2011 01:06:19) [19]
Ты только что выше сказал, что не подходитЮ что мол это бред, а теперь
начинаешь отказываться от своих слов, нехорошо это.
Anatoly Podgoretsky (2011-11-10 08:40:00) [6]> vegarulez (10.11.2011 00:42:13) [13]
Окроме отвечающих, есть еще и задающий вопрос, который часть не по существу.
И ты не делай выговора другим людям, это не твоя комптенция, а то будешь
только читать.
Медвежонок Пятачок (2011-11-10 08:40:00) [7]Траем обернут вызвов бд и проверка полей и таблиц,
Потому что для тебя эксепшен - досадная достающая фича. Отсюда желание загасить их все разом.
можно канешно обернуть каждый шаг,
не можно, а нужно, если анализировать класс эксепшена и его атрибуты - это не царское дело.
но бояюсь обёртка тогда растянет код километров на 100
Бояешся потому что понятия не имеешь о структурировании кода и лепишь куче всякой хрени прямо в OnCreate
Проверка наличия поля - это одна функция.
Добавление несуществующего поля - другая функция.
Anatoly Podgoretsky (2011-11-10 08:38:00) [8]> vegarulez (10.11.2011 00:41:12) [12]
Бред писать не надежно, ленясь набить несколько символов.
Anatoly Podgoretsky (2011-11-10 08:36:00) [9]> vegarulez (10.11.2011 00:13:05) [5]
Fields все поля
Inovet (2011-11-10 01:57:00) [10]> [5] vegarulez (10.11.11 00:13)
> собственно чтобы alter сделать - надо узнать сперва есть
> ли фиелд в табличке.
> [4] Inovet © (10.11.11 00:11)
> Хранить версию схемиы, и накатывать апдейты по очереди
Версию хранить в базе при накате апдейта менять на соответствующую.
vegarulez (2011-11-10 01:17:00) [11]Выжимая экстракт авокадо из вышенаписанного полагаю:
Сделать каждый alter в try и тогда просто продолжать работу если произойдёт экцепт. (т.е. полагаем, что поле уже есть, если происходит эксцепт ориентируясь на inttostr(E.HelpContext), что именно ошибка уже существующего поля, а не какая-то другая при которой terminate)
Как то так???
vegarulez (2011-11-10 01:09:00) [12]Медвежонок Пятачок © (10.11.11 01:00) [18]
я это понимаю и много где использую но на что тогда ориентироваться в нём?
На номера ошибок в HelpContext? И по ним определять?
except
on E: Exception do
...
E.HelpContext
Но если там несколько альтеров и селектов, то как я определю - какой именно даёт сбой - счётчик прилепить. Как то тоже не очень красиво на мой взгляд.
vegarulez (2011-11-10 01:06:00) [13]У вас учёная степень доктора наук по определению дебильности кода?
Странно я вроде нигде не утверждал что они не подходят - ибо ещё не пробовал. Ста километрами там и не пахнет (на один бензин год работать придётся при ЕДРОсах у руля))) пока доедешь до конца кода). Траем обернут вызвов бд и проверка полей и таблиц, можно канешно обернуть каждый шаг, но бояюсь обёртка тогда растянет код километров на 100 )) в итоге никакого выйгрыша ни по бензину ни по обёртке.
Медвежонок Пятачок (2011-11-10 01:00:00) [14]значит в БД косяки и эта версия завершит работу.
Эксепшен - это не ошибка, это механизм данный тебе для упрощения твоего кода и инструмент для написания надежных программ.
Медвежонок Пятачок (2011-11-10 00:56:00) [15]должна и обязана. Для этого и танцы с бубном - для приведения базы к новой версии.
Ну если таки должна, то не стоит так дебильно проектировать код:
обернуть сто километров кода в единый трай/эксепт и в обработчике делать терминэйт, а потом говорить, что мне ваши способы неподходят, потому что я так пишу программы
vegarulez (2011-11-10 00:51:00) [16]Медвежонок Пятачок © (10.11.11 00:43) [14]
должна и обязана. Для этого и танцы с бубном - для приведения базы к новой версии.
я сюда за этим и пришёл - я не гуру. коллективный разум помогает направлять размышления в правильное русло. Уже не плохо то, что скрываясь в вашей величественной тени имею наглость размышлять.
Медвежонок Пятачок © (10.11.11 00:44) [15]
Попробую отпишусь, вдруг кто-то предложит 5-ый - золотой.
Медвежонок Пятачок (2011-11-10 00:44:00) [17]так пости по существу.
Тебе уже четыре способа предложили.
Медвежонок Пятачок (2011-11-10 00:43:00) [18]В ветке try при работе с БД при ексцепшине просто terminate - значит в БД косяки и эта версия завершит работу.
окей.
значит новая программа просто не должна работать со старой базой.
Или на каждый селект и альтер отдельный try делать - но это же бред.
бред - это твои размышления здесь
vegarulez (2011-11-10 00:42:00) [19]Медвежонок Пятачок © (10.11.11 00:37) [11]
так пости по существу.
vegarulez (2011-11-10 00:41:00) [20]Медвежонок Пятачок © (10.11.11 00:25) [6]
В ветке try при работе с БД при ексцепшине просто terminate - значит в БД косяки и эта версия завершит работу. Не важно чем они могут быть вызваны.
>>а типа получив исключение ты лично встанешь в тупик и не поймешь от чего он произошел
можно и не понять может БД нет а может поля. try то большой. Или на каждый селект и альтер отдельный try делать - но это же бред.