Russian Qt Forum

Qt => Базы данных => Тема начата: crossly от Апрель 22, 2008, 20:24



Название: обновление БД
Отправлено: crossly от Апрель 22, 2008, 20:24
тут пришла мысля.... ;D но не какне могу вкурить с чего начать курить :)... есть приложение (Qt 4.3.4) БД (firebird 2.0) и есть скрипт который производит изменения в БД... задача следующая.. выполнить этот скрипт из приложения.. подскажите куда копать плиз...


Название: Re: обновление БД
Отправлено: Sergeich от Апрель 22, 2008, 22:10
Если это SQL-скрипт читай его построчно и выполняй QSqlQuery, в чем проблема то?


Название: Re: обновление БД
Отправлено: Вячеслав от Апрель 22, 2008, 22:10
Скрипт - sql ?
1) вариант чего-нибудь типа antlr в зубы и выполнять скрипт самому по запросам ... Даже без ant'a можно обойтись - скрипт обычно тупой - можно на уровне QString'a\QRegexp'a поиграться
2) в лоб QProcess + isql и типа опа ;) Но 1) безопастность - isql захочет login/pass 2) разбор полетов - возможная ругань isql'я .....

Хотя я в данном случае предпочитаю создавать скрипт на питоне сразу с контролем ошибок ;)


Название: Re: обновление БД
Отправлено: Вячеслав от Апрель 22, 2008, 22:11
Если это SQL-скрипт читай его построчно и выполняй QSqlQuery, в чем проблема то?
alter table / drop index /create index оно сожрет  в качестве строки  ?
PS интереса ради - сам не пробывал


Название: Re: обновление БД
Отправлено: Sergeich от Апрель 22, 2008, 22:14
Если это SQL-скрипт читай его построчно и выполняй QSqlQuery, в чем проблема то?
alter table / drop index /create index оно сожрет  в качестве строки  ?
PS интереса ради - сам не пробывал
А куда оно денется? По крайней мере на MySQL и SQLite проблем c выполнением таких скриптов не возникало


Название: Re: обновление БД
Отправлено: Вячеслав от Апрель 22, 2008, 22:24
Ясно ;) Надо будет  поглядеть на трезвую голову ;) Чего-то мне помниться что в начале 4 ветки были грабли с ДМЛ .... Но наверное их уже поправили ;)


Название: Re: обновление БД
Отправлено: Tonal от Апрель 23, 2008, 07:22
Есть ещё вариант дла винды: IBEScript.dll или IBEScript.exe от IBExpert-а :-)


Название: Re: обновление БД
Отправлено: crossly от Апрель 23, 2008, 11:36
мдя... лично мне кроме разбора скрипта и выполнения по частям тоже ничего в голову не пришло... спасибо за ответы... ;)


Название: Re: обновление БД
Отправлено: Tonal от Апрель 23, 2008, 13:33
Если в скрипте не могут встречаться триггеры и хранимки, то разбор довольно простой: режешь по ;.
Правда дополнительной обработки требуют строковые константы, ну да это тоже побеждается довольно просто. :)


Название: Re: обновление БД
Отправлено: pastor от Апрель 23, 2008, 13:44
По этому поводу был suggestion на Task Tracker #129497 (http://trolltech.com/developer/task-tracker/index_html?method=entry&id=129497)

Но, имхо, это больше походит на отмазку тролей )))


Название: Re: обновление БД
Отправлено: crossly от Апрель 23, 2008, 16:14
действительно отмака..,:) а по поводу хранимых и тригеров тоже не вижу проблемы... главное отлавливать втексте set term и менять разделитель строки....:)


Название: Re: обновление БД
Отправлено: White Owl от Май 09, 2008, 17:05
По этому поводу был suggestion на Task Tracker #129497 (http://trolltech.com/developer/task-tracker/index_html?method=entry&id=129497)

Но, имхо, это больше походит на отмазку тролей )))
Это не отмазка, это скорее ответ на глупый вопрос.

Тут все зависит от сервера. В одних случаях скрипт состоящий из нескольких команд нужно резать на отдельные команды и посылать их по отдельности. Например:
Код:
use mydb
go
create table t(....)
go
insert into t values(...)
go
Для ASE этот скрипт НАДО резать на три отдельные команды и посылать по отдельности.
А вот такой скрипт резать на отдельные команды можно, но не обязательно:
Код:
insert into t values(...)
insert into t values(...)
insert into t values(...)
select * into t1 from t where ....
А если мы перейдем c ASE на ASA, то вот такой скрипт:
Код:
begin atomic
insert into t values(....);
insert into t valuse(....);
insert into t valuse(....);
end;
Резать на команды перед посылкой на сервер уже просто нельзя. Не смотря на то что там три отдельных команды, но они сгрупированны в одну (конструкцией begin atomic ... end) и будут обработаны сервером как одна. В смысле если первая прошла, а вторая не смогла, то первая команда будет автоматически откачена, а третья вообще запущена не будет.

Отсюда и вывод: встраивать в QSqlQuery автоматическую резалку строки на команды - нельзя.