Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1319833839
Германн
2011-10-29 00:30
2012.02.19
Кто-нибудь помнит TP 7.0?


2-1320825704
Laguna
2011-11-09 12:01
2012.02.19
Определение прервавшегося коннекта


15-1319710006
Torry
2011-10-27 14:06
2012.02.19
А вы знаете что...?


15-1318709342
Юрий Зотов
2011-10-16 00:09
2012.02.19
ММП 28-го ?


2-1320786460
I
2011-11-09 00:07
2012.02.19
Компиляция в командной строке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский