Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];
ВнизПроверка наличия поля в таблице. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.005 c