Russian Qt Forum
Сентябрь 30, 2024, 16:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: обновление БД  (Прочитано 7307 раз)
crossly
Гость
« : Апрель 22, 2008, 20:24 »

тут пришла мысля.... Смеющийся но не какне могу вкурить с чего начать курить Улыбающийся... есть приложение (Qt 4.3.4) БД (firebird 2.0) и есть скрипт который производит изменения в БД... задача следующая.. выполнить этот скрипт из приложения.. подскажите куда копать плиз...
Записан
Sergeich
Гость
« Ответ #1 : Апрель 22, 2008, 22:10 »

Если это SQL-скрипт читай его построчно и выполняй QSqlQuery, в чем проблема то?
Записан
Вячеслав
Гость
« Ответ #2 : Апрель 22, 2008, 22:10 »

Скрипт - sql ?
1) вариант чего-нибудь типа antlr в зубы и выполнять скрипт самому по запросам ... Даже без ant'a можно обойтись - скрипт обычно тупой - можно на уровне QString'a\QRegexp'a поиграться
2) в лоб QProcess + isql и типа опа Подмигивающий Но 1) безопастность - isql захочет login/pass 2) разбор полетов - возможная ругань isql'я .....

Хотя я в данном случае предпочитаю создавать скрипт на питоне сразу с контролем ошибок Подмигивающий
Записан
Вячеслав
Гость
« Ответ #3 : Апрель 22, 2008, 22:11 »

Если это SQL-скрипт читай его построчно и выполняй QSqlQuery, в чем проблема то?
alter table / drop index /create index оно сожрет  в качестве строки  ?
PS интереса ради - сам не пробывал
Записан
Sergeich
Гость
« Ответ #4 : Апрель 22, 2008, 22:14 »

Если это SQL-скрипт читай его построчно и выполняй QSqlQuery, в чем проблема то?
alter table / drop index /create index оно сожрет  в качестве строки  ?
PS интереса ради - сам не пробывал
А куда оно денется? По крайней мере на MySQL и SQLite проблем c выполнением таких скриптов не возникало
Записан
Вячеслав
Гость
« Ответ #5 : Апрель 22, 2008, 22:24 »

Ясно Подмигивающий Надо будет  поглядеть на трезвую голову Подмигивающий Чего-то мне помниться что в начале 4 ветки были грабли с ДМЛ .... Но наверное их уже поправили Подмигивающий
Записан
Tonal
Гость
« Ответ #6 : Апрель 23, 2008, 07:22 »

Есть ещё вариант дла винды: IBEScript.dll или IBEScript.exe от IBExpert-а :-)
Записан
crossly
Гость
« Ответ #7 : Апрель 23, 2008, 11:36 »

мдя... лично мне кроме разбора скрипта и выполнения по частям тоже ничего в голову не пришло... спасибо за ответы... Подмигивающий
Записан
Tonal
Гость
« Ответ #8 : Апрель 23, 2008, 13:33 »

Если в скрипте не могут встречаться триггеры и хранимки, то разбор довольно простой: режешь по ;.
Правда дополнительной обработки требуют строковые константы, ну да это тоже побеждается довольно просто. Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Апрель 23, 2008, 13:44 »

По этому поводу был suggestion на Task Tracker #129497

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
crossly
Гость
« Ответ #10 : Апрель 23, 2008, 16:14 »

действительно отмака..,:) а по поводу хранимых и тригеров тоже не вижу проблемы... главное отлавливать втексте set term и менять разделитель строки....Улыбающийся
Записан
White Owl
Гость
« Ответ #11 : Май 09, 2008, 17:05 »

По этому поводу был suggestion на Task Tracker #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 автоматическую резалку строки на команды - нельзя.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.