![]() |
|
|
![]()
|
|
| fess |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
Есть много sql-комманд в текстовом файле, необходимо их все загрузить и выполнить одну за другой. Пытаюсь сделать через ADOQuery, загружаю текст запросов из файла, потом - выполнить - никак(( Оставляю только одни запрос - всё в порядке!
Как это можно обойти? Например, есть текстовый файл типа:
Надо в нём выполнить все команды. Если оставляю одну любую команду в файле и его пытаюсь выполнить через ADOQuery - то всё - она выполняется. А 2 и более команды - ошибка:
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
||||
|
|||||
| Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
А что мешает в цикле перебрать все запросы и выполнить.
-------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
| fess |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
В принципе, ничего)) Но они не всегда состоят из одной строчки (( Это в конкретном примере - каждый запрос в отдельной строке... а в общем случае - это не так...
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 22 Всего: 122 |
fess, реализуй поиск зарезервированных слов или вот так
Это сообщение отредактировал(а) Rodman - 7.1.2007, 20:36 |
|||
|
||||
| fess |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
Не катит... я пробовал... там в запросах могут быть ";" и как определить, внутри ли они запроса или на этом символе он заканчивается - я не догнал... По этой же причине не поможет поиск зарезервированных слов...
А как-нибудь по-другому, не через ADOQuery можно это сделать? Эти файлы с запросами спокойно выполняются просто - из базы данных (используется MySQL)... не понятно, почему никак не получается такую же фишку провернуть из программы.... Это сообщение отредактировал(а) fess - 7.1.2007, 21:44 --------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 22 Всего: 122 |
fess, кто формирует этот файл с запросами??? ты можешь сделать его одной структуры?? а потом можно подумать как его распарсить!!!
Добавлено @ 21:50 вот еще в голову пришло...
|
|||
|
||||
| fess |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
Сложно сказать))) эти файлы скачиваются откуда-то из инета... Скорее всего - просто экспорт из MySql.... Их несколько... Все их надо применить для базы... Структура-то у них нормальная... Запрос и должен заканчиваться точкой с запятой... Я говорил, что это не прокатит... по ключевым словам... Т.к. в запросе может быть строка, в которой есть это ключевое слово... И регистр неизвестен... Я думаю, что проблема даже не в парсинге... Как-то же можно передать много запросов в одном? Или никак? --------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
|||
|
||||
| Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Не могут быть, только в конце запроса, иначе сами подумайте как бы MySQL понимал ";" в середине скрипта. В MySQL как я знаю ";" и есть признак окончания всего запроса. Вот по ним и орентируйтесь. Добавлено @ 10:40 Никак, токи парсить самому. Это сообщение отредактировал(а) Vas - 8.1.2007, 10:39 -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
| Sansa |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 2 Всего: 6 |
Попробуй использовать ZeosDBO. Он самостоятельно разбирает введенные SQL команды.
--------------------
- Здравствуйте, я Ваш патологоанатом |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 22 Всего: 122 |
||||
|
||||
| fess |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
Пример запроса с ';' внутри:
Я примерно догнал, как парсить)) Спасибо,Vas и Rodman за идею! В общем, точка с запятой должна быть последним символом в строке - тогда это запрос)) Вроде, пока получается) Хотя, это тоже не совсем корректно (т.к. а если 2 запроса в строке будут?)
Попробую)) Просто хотелось обойтись стандартными компонентами... Это сообщение отредактировал(а) fess - 8.1.2007, 13:45 --------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
||||
|
|||||
| Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
";" может еще встречаться в сердине запроса но как строковое значение то бишь ';' вот, так что дело за маленьким парсить строку посимвольно и учитывать открыт " ' " или нет, если открыт и встретили ";" то пропускаем это не окончание запроса и так далее
-------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
fess,
У тебя НИКОГДА не получится выполнить несколько запросов "за 1 раз", т.е. за 1 загрузку Query. Подробности - в статье на DelphiKingdom, которая как-то так и названа - "Выполнение нескольких SQL-запросов" (точно не помню - сам ищи). Суть: после выполнения возвращается число, для 1 запроса оно равно 1, и только оно считается правильным. Если запросов 2 в одном запуске Query, вернется 2 - это считается ошибкой. Так что ищи/делай парсер. Или иди другим путем. |
|||
|
||||
| fess |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
fess,
Вот и разберись с этим - откуда и почему так. Сам попробуй скачивать в нужном тебе формате, выпытав у заказчика источник. А ежели заказчик признаваться не хочет - ну так и флаг ему в руки, пусть сам ручками парсит и вкачивает. Самый прямолинейный способ. |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 22 Всего: 122 |
это не выход.. у заказчика флаг всегда в руках... fess, тебе закономерность нужно выявить... или там формировать файл необходимого формата.. |
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Rodman,
Я человек простой. И в таких ситуациях просто беру заказчика за ручку и объясняю: "Это можно сделать, но это стоит ...". Поскольку в ТЗ таких вещей как правило не бывает. И в устных договоренностях тоже. И ЗАБЕСПЛАТНО разгребать дерьмо, которое мне подсовывают "в нагрузку", я не буду. Себе дороже. Сядут на шею и ножки свесят. Проходили... Нехай этому заказчику такую задачу решает "студент калинарного техникума" (с) Хазанов. Сам потом прибежит каяться. Ну это оффтопик был. Топик: ну какие, нафиг, закономерности? Файл уже есть идиотского формата. Решается просто, как валенок: после выяснения "откуда ЭТО", после каждого выкачанного SET bla-bla-bla на N строк просто вставляется пустая строка. Мне с периодичностью 1 раз в 2-3 месяца приходится объяснять: "Если у ВАС так все засекречено и запутано, то либо я ЭТО изменю в нужную сторону (читай - построю и выровняю очередного идиота, который в dbf-нике хочет иметь поля N(20,2)), либо ВЫ мне за эту ВАШУ секретность заплатите, причем немало". Обычно выбирают первое |
|||
|
||||
| Sansa |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 2 Всего: 6 |
SergeBS, судя по всему, этот файл - архив базы какого-то web проекта (CMS, WIKI, форума)... Вполне стандартный. И переделывать движок backup and restore из-за претензий стороннего разработчика никто не будет. Так же, как и формировать для него отдельный. Да и не очень красиво выглядят 100 000 файликов содержащих по 1-5 строк.
Тем более, что клиент mysql (а так же pgsql) а может быть еще многие, понимают его на ура. Вся беда, что реализация ADO этого не позволяет. Можно пойти 2-мя путями: 1. Обтачивать молоток, пока он не станет рубить; 2. Взять топор (поменять ядро БД). Вот только что проверил, клиент sqlite имеет функцию .read FileName, которому я скормил файл из первого топика, и все прошло (правда, до этого пришлось создать таблицу). Либо парсить. Кстати, обратите внимание на regexp'ы. --------------------
- Здравствуйте, я Ваш патологоанатом |
|||
|
||||
| fess |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 17.2.2005 Где: г. Мурманск, Росс ия Репутация: нет Всего: 3 |
Угу... Это Mangos - бесплатный Word Of Warcraft сервер... И никто ничего переделывать не будет...
По подробнее можно немного: что такое sqlite и regexp и с чем это едят? ) --------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом. |
|||
|
||||
| CatATonik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 12.1.2007 Где: Москва Репутация: нет Всего: 8 |
А если попробовать ADOCommand, CommandType = cmdText, ParamCheck = False?
|
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Sansa,
"Вы нашу птичку не троньте!". ADO совершенно фиолетово, какие команды отправлять серваку - что DML, что DDL. И получается что нужно всего лишь скомандовать:" А ну-ка, хапнул файло, там-то лежащее, как свой скрипт." Без проблем. Собственно я, например, просто не знаю - сумеет MySQL загрузить в себя из текстухи эту тучу команд или нет. Как-то не привык, что данные кто-то хранит в виде скрипта, вбивающего их в таблицы. Уж больно неэкономно. |
|||
|
||||
| Sansa |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 2 Всего: 6 |
To fess
sqlite - простенький движок базы данных, ориентированный на локальную однопользовательскую работу. Доступ к базам данных SQLite - ZEOS DBO или нативные компоненты. Regexp - регулярные выражения, язык, позволяющий осуществлять поиск более гибко. Например, задав в строку поиска /(^(SELECT)|(INSERT)|(UPDATE).*\;$)/i вернет тебе кусок текста, начинающийся или с SELECT или с INSERT или с UPDATE и заканчивающийся точкой с запятой, если за ней сразу идет перевод строки (в различных реализациях синтаксис может слегка изменяться). Мне наиболее понравилась реализация TRegExpr, но можно воспользоваться любой другой. О них упомянул на случай, если все-же придется использовать ADO и парсить. To SergeBS Согласен, что ADO фиолетово. Просто у него (возможно только в Delphi, а какие-нибудь утилитки енто могут) не реализована возможность пакетного выполнения. MySQL 100% может принимать последовательность SQL команд (как из файла, так и просто из командной строки), разделенных ";". А на счет экономичности - может быть... Зато практично. И в windows и в linux и в MacOS не потребуется никаких операций с файлом. На крайняк, мона зазиповать. --------------------
- Здравствуйте, я Ваш патологоанатом |
|||
|
||||
| baxus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Народ, у меня почти такая же проблема, только запрос выглядит след. образом:
Пытаюсь выполнить, через TADOQuery, но в результате получаю ошибку, ругается кажется на GO :( Конечно самый тупой вариант это парсить самому, но может можно как-то обойтись стандартными компонентами? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
baxus,
Если у тебя все команды разделены GO, то написать свой парсер - не проблема: ищешь это GO, все что перед - загружаешь и выполняешь, его (GO) просто выкидываешь и ищешь следующий. И так до конца файла. Или вообще юзаешь EXECUTE на сервере. Передав ему все команды как огроменную строку. Пробуй. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |