Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проверка наличия поля в таблице. [D7, XP]


Страницы:   1 2

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 делать - но это же бред.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо