Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.19;
Скачать: CL | DM;

Вниз

Проверка наличия поля в таблице.   Найти похожие ветки 

 
vegarulez   (2011-11-09 23:34) [0]

Буэнос диас, комрады!
Подскажите такой вопрос - как проверить наличие поля в таблице и если его нет то создать, если есть то просто продолжить работу.

использую *.mdb + zquery

проверяю наличия поля в таблице через

    Zquery1.SQL.Text:="Select xml_2 from cfg where 1";
    Zquery1.Open;
    if not (Zquery1.FieldCount>0) then
     Begin
       ...  
     End;


но вот беда если поля в таблице нет то запрос вываливается в эксцепшн (
как более правильно проверять такие вещи и создавать поля если их нет.


 
И. Павел ©   (2011-11-09 23:48) [1]


> vegarulez   (09.11.11 23:34)

Можно делать SELECT * WHERE 1 = 0 и смотреть список полей, их типы и т.д.

Хотя наверняка можно через системные таблицы вытащить, но способ выше универсальнее :)

PS: Ситуации, когда действительно оправдано динамически создавать и удалять поля в таблицах очень редкие. В большинстве случаев можно обойтись без такого усложнения.


 
vegarulez   (2011-11-10 00:01) [2]

Поверь мне нужно динамически приводить базы в одно состояние на разных тачках в зависимости от обновлений. Поэтому нужен такой подход - проверять эти поля в форм криэйте и создавать их перед запуском программы если их нет.


 
Медвежонок Пятачок ©   (2011-11-10 00:04) [3]

но вот беда если поля в таблице нет то запрос вываливается в эксцепшн (

это не беда, а сигнал.
поля нет.


 
Inovet ©   (2011-11-10 00:11) [4]

> [2] vegarulez   (10.11.11 00:01)
> Поверь мне нужно динамически приводить базы в одно состояние
> на разных тачках в зависимости от обновлений.

Хранить версию схемиы, и накатывать апдейты по очереди. Апдейты на DDL
alter table add field;
alter index;
и т.п.


 
vegarulez   (2011-11-10 00:13) [5]

Inovet ©   (10.11.11 00:11) [4]
собственно  чтобы alter сделать - надо узнать сперва есть ли фиелд в табличке. собственно поэтому и сабж. как это сделать правильно.


 
Медвежонок Пятачок ©   (2011-11-10 00:25) [6]

а типа получив эксепшен ты все еще не понял, что поля нет


 
Медвежонок Пятачок ©   (2011-11-10 00:29) [7]

или если боишся исключений

TDataSet.FieldDefs.Update;
TDataSet.FieldDefs.Find();


 
sniknik ©   (2011-11-10 00:33) [8]

> а типа получив эксепшен ты все еще не понял, что поля нет
а типа эксепт гарантирует что он от отсутствия поля... а не от коннекта например.

> как это сделать правильно.
в ADO есть получение списка/полей, или более подробной инфы через OpenSchema.
ищи, может и в твоих "+ zquery" подобное тоже есть... ну или претензию разработчику.


 
Медвежонок Пятачок ©   (2011-11-10 00:35) [9]

а типа получив исключение ты лично встанешь в тупик и не поймешь от чего он произошел


 
vegarulez   (2011-11-10 00:36) [10]

sniknik ©   (10.11.11 00:33) [8]

>>ищи, может и в твоих "+ zquery"

забыл уточнить использую ZEOSDBO


 
Медвежонок Пятачок ©   (2011-11-10 00:37) [11]

очередная ветка из ничего постов на сто


 
vegarulez   (2011-11-10 00:41) [12]

Медвежонок Пятачок ©   (10.11.11 00:25) [6]
В ветке try при работе с БД при ексцепшине просто terminate - значит в БД косяки и эта версия завершит работу. Не важно чем они могут быть вызваны.

>>а типа получив исключение ты лично встанешь в тупик и не поймешь от чего он произошел

можно и не понять может БД нет а может поля. try то большой. Или на каждый селект и альтер отдельный try делать - но это же бред.


 
vegarulez   (2011-11-10 00:42) [13]

Медвежонок Пятачок ©   (10.11.11 00:37) [11]
так пости по существу.


 
Медвежонок Пятачок ©   (2011-11-10 00:43) [14]

В ветке try при работе с БД при ексцепшине просто terminate - значит в БД косяки и эта версия завершит работу.

окей.
значит новая программа просто не должна работать со старой базой.

Или на каждый селект и альтер отдельный try делать - но это же бред.

бред - это твои размышления здесь


 
Медвежонок Пятачок ©   (2011-11-10 00:44) [15]

так пости по существу.

Тебе уже четыре способа предложили.


 
vegarulez   (2011-11-10 00:51) [16]

Медвежонок Пятачок ©   (10.11.11 00:43) [14]

должна и обязана. Для этого и танцы с бубном - для приведения базы к новой версии.

я сюда за этим и пришёл - я не гуру. коллективный разум помогает направлять размышления в правильное русло. Уже не плохо то, что скрываясь в вашей величественной тени имею наглость размышлять.

Медвежонок Пятачок ©   (10.11.11 00:44) [15]

Попробую отпишусь, вдруг кто-то предложит 5-ый - золотой.


 
Медвежонок Пятачок ©   (2011-11-10 00:56) [17]

должна и обязана. Для этого и танцы с бубном - для приведения базы к новой версии.

Ну если таки должна, то не стоит так дебильно проектировать код:

обернуть сто километров кода в единый трай/эксепт и в обработчике делать терминэйт, а потом говорить, что мне ваши способы неподходят, потому что я так пишу программы


 
Медвежонок Пятачок ©   (2011-11-10 01:00) [18]

значит в БД косяки и эта версия завершит работу.

Эксепшен - это не ошибка, это механизм данный тебе для упрощения твоего кода и инструмент для написания надежных программ.


 
vegarulez   (2011-11-10 01:06) [19]

У вас учёная степень доктора наук по определению дебильности кода?

Странно я вроде нигде не утверждал что они не подходят - ибо ещё не пробовал. Ста километрами там и не пахнет (на один бензин год работать придётся при ЕДРОсах у руля))) пока доедешь до конца кода). Траем обернут вызвов бд и проверка полей и таблиц, можно канешно обернуть каждый шаг, но бояюсь обёртка тогда растянет код километров на 100 )) в итоге никакого выйгрыша ни по бензину ни по обёртке.


 
vegarulez   (2011-11-10 01:09) [20]

Медвежонок Пятачок ©   (10.11.11 01:00) [18]
я это понимаю и много где использую но на что тогда ориентироваться в нём?

На номера ошибок в HelpContext? И по ним определять?

 except
  on E: Exception do
...
  E.HelpContext


Но если там несколько альтеров и селектов, то как я определю - какой именно даёт сбой - счётчик прилепить. Как то тоже не очень красиво на мой взгляд.


 
vegarulez   (2011-11-10 01:17) [21]

Выжимая экстракт авокадо из вышенаписанного полагаю:
Сделать каждый  alter в try и тогда просто продолжать работу если произойдёт экцепт. (т.е. полагаем, что поле уже есть, если происходит эксцепт ориентируясь на inttostr(E.HelpContext), что именно ошибка уже существующего поля, а не какая-то другая при которой terminate)
Как то так???


 
Inovet ©   (2011-11-10 01:57) [22]

> [5] vegarulez   (10.11.11 00:13)
> собственно  чтобы alter сделать - надо узнать сперва есть
> ли фиелд в табличке.

> [4] Inovet ©   (10.11.11 00:11)
> Хранить версию схемиы, и накатывать апдейты по очереди

Версию хранить в базе при накате апдейта менять на соответствующую.


 
Anatoly Podgoretsky ©   (2011-11-10 08:36) [23]

> vegarulez  (10.11.2011 00:13:05)  [5]

Fields все поля


 
Anatoly Podgoretsky ©   (2011-11-10 08:38) [24]

> vegarulez  (10.11.2011 00:41:12)  [12]

Бред писать не надежно, ленясь набить несколько символов.


 
Медвежонок Пятачок ©   (2011-11-10 08:40) [25]

Траем обернут вызвов бд и проверка полей и таблиц,
Потому что для тебя эксепшен - досадная достающая фича. Отсюда желание загасить их все разом.

можно канешно обернуть каждый шаг,

не можно, а нужно, если анализировать класс эксепшена и его атрибуты - это не царское дело.

но бояюсь обёртка тогда растянет код километров на 100

Бояешся потому что понятия не имеешь о структурировании кода и лепишь куче всякой хрени прямо в OnCreate

Проверка наличия поля - это одна функция.
Добавление несуществующего поля - другая функция.


 
Anatoly Podgoretsky ©   (2011-11-10 08:40) [26]

> vegarulez  (10.11.2011 00:42:13)  [13]

Окроме отвечающих, есть еще и задающий вопрос, который часть не по существу.
И ты не делай выговора другим людям, это не твоя комптенция, а то будешь
только читать.


 
Anatoly Podgoretsky ©   (2011-11-10 08:42) [27]

> vegarulez  (10.11.2011 01:06:19)  [19]

Ты только что выше сказал, что не подходитЮ что мол это бред, а теперь
начинаешь отказываться от своих слов, нехорошо это.


 
Anatoly Podgoretsky ©   (2011-11-10 08:43) [28]

> vegarulez  (10.11.2011 01:09:20)  [20]

INFORMATION_SCHEMA


 
Smile   (2011-11-10 09:31) [29]

ADOQuery1.FieldDefList.Text; // список полей выбранной таблицы


 
Плохиш ©   (2011-11-10 11:02) [30]

Я тащусь от отвечающих :-)) можно подумать, что они ник топикстартера первый раз видят.


 
MsGuns ©   (2011-11-10 11:07) [31]

Попробую предложить 5-й, "загадочный" вариант.
Вернее не вариант, а скорее соялнка из предложенного ранее.

Во-первых, непременно разделить весь функционал (читай-программу) на 2 части 1) Верификация + апдэйт по стандартной схеме, на которую тут намекает Inovet ©  
2) - Собственно пользовательское приложение, которое работает с базой, преполагая, что она уже приведена к нужной версии.

Схему (инструкцию) по апдэйтам, мне кажется, расписывать не нужно, Вы сами вполне сообразите.

По коду несколько  замечаний
1) Плохо, когда в OnCreate запихивают кучу вещей, которые могут вовсе не пригодиться при работе с программой (например, создание датамодулей и форм, которые юзер ни разу даже не откроет),  совсем плохо, когда туду еще суют "базовые" (т.е. потенциально опасные) штучки (логин, открытие таблиц и запросов), и совсем уже хреново, если туда умудряются вмантулить код, меняющий СТРУКТУРУ базы данных.
Выносите все это куданить в другие места, более контекстно уместные, например открытие базы (и соотв.таблиц) по кнопке или при активации соотв.формы
2) try except/finally придумали именно для того, чтобы дать программисту возможность отреагировать на независящее от него событие вместе (а иногда и ВМЕСТО) со средой. Любые действия с базой данных относятся к потенциально опасному коду и в ХОРОШЕЙ программе должны соотв.бразом "предохраняться". Будете Вы это делать или нет - дело в конечном счете Ваше.
3) Избежать "километров" кода очень легко, используя нехитрые приемы, например вынося "за скобки" повторяющийся код.



Страницы: 1 вся ветка

Текущий архив: 2012.02.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.011 c
6-1251306114
Pirog
2009-08-26 21:01
2012.02.19
Получить список имена доменов


2-1320039328
Laguna
2011-10-31 08:35
2012.02.19
Уменьшение размера EXE-ншика


11-1241546268
Sem
2009-05-05 21:57
2012.02.19
Временные библиотеки


9-1191695293
Galiaf
2007-10-06 22:28
2012.02.19
Мерцание полигонов.


2-1320767426
toropoff
2011-11-08 18:50
2012.02.19
Структура таблиц сроков исполнения