Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение нескольких SQL-запросов за один раз, Как это реальизовать в ADO? 
:(
    Опции темы
fess
Дата 7.1.2007, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Есть много sql-комманд в текстовом файле, необходимо их все загрузить и выполнить одну за другой. Пытаюсь сделать через ADOQuery, загружаю текст запросов из файла, потом - выполнить - никак(( Оставляю только одни запрос - всё в порядке! 
Как это можно обойти? 

Например, есть текстовый файл типа:
Код

UPDATE `areatrigger_tavern` SET `name`='Westfall - Sentinel Hill Inn' WHERE (`id`='71');
UPDATE `areatrigger_tavern` SET `name`='Elwynn Forest - Goldshire - Lion\'s Pride Inn' WHERE (`id`='562');
UPDATE `areatrigger_tavern` SET `name`='Redridge Mountains - Lakeshire Inn' WHERE (`id`='682');
UPDATE `areatrigger_tavern` SET `name`='Teldrassil - Dolanaar' WHERE (`id`='715');
UPDATE `areatrigger_tavern` SET `name`='Darkshore - Auberdine' WHERE (`id`='716');
UPDATE `areatrigger_tavern` SET `name`='Ashenvale - Astranaar' WHERE (`id`='717');

Надо в нём выполнить все команды. Если оставляю одну любую команду в файле и его пытаюсь выполнить через ADOQuery - то всё - она выполняется. А 2 и более команды - ошибка:
Код

[MySQL][ODBC 3.51 Driver][mysqld-5.0.18-max]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
UPDATE `areatrigger_tavern` SET `name`='Elwynn Forest - Goldshire - Lion\'s P' at line 1

--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Vas
Дата 7.1.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



А что мешает в цикле перебрать все запросы и выполнить.
Код

var StrLst:TStringList;
    i:integer;
begin
  StrLst:=TStringList.Create;
  try
    StrLst.LoadFromFile('[файл]');
    for i:=0 to StrLst.Count-1 do
      begin
        ADOQuery.SQl.Clear;
        ADOQuery.SQL.Text:=StrLst[i];
        try
          ADOQuery.ExecSQl;
        except
        end;
      end;
  finally
    StrLst.Free;
  end;
end;



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
fess
Дата 7.1.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



В принципе, ничего)) Но они не всегда состоят из одной строчки (( Это в конкретном примере - каждый запрос в отдельной строке... а в общем случае - это не так...
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Rodman
Дата 7.1.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



fess, реализуй поиск зарезервированных слов или вот так
Код

var StrLst:TStringList;
    i:integer;
begin
  StrLst:=TStringList.Create;
  try
    StrLst.LoadFromFile('[файл]');
    for i:=0 to StrLst.Count-1 do
      begin
        ADOQuery.SQL.Add(StrLst[i]);
        if(pos(StrLst[i],';')then
        begin
        try
          ADOQuery.ExecSQL;
        except
        end;
         ADOQuery.SQl.Clear;
        end;
      end;
  finally
    StrLst.Free;
  end;
end;


Это сообщение отредактировал(а) Rodman - 7.1.2007, 20:36
PM MAIL WWW Skype GTalk YIM MSN   Вверх
fess
Дата 7.1.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Не катит... я пробовал... там в запросах могут быть ";" и как определить, внутри ли они запроса или на этом символе он заканчивается - я не догнал... По этой же причине не поможет поиск зарезервированных слов... 
А как-нибудь по-другому, не через ADOQuery можно это сделать?
Эти файлы с запросами спокойно выполняются просто - из базы данных (используется MySQL)... не понятно, почему никак не получается такую же фишку провернуть из программы....

Это сообщение отредактировал(а) fess - 7.1.2007, 21:44
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Rodman
Дата 7.1.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



fess, кто формирует этот файл с запросами??? ты можешь сделать его одной структуры?? а потом можно подумать как его распарсить!!!

Добавлено @ 21:50 
вот еще в голову пришло...
Код

var StrLst:TStringList;
    i,j:integer;
begin
  StrLst:=TStringList.Create;
   j:=0;
  try
    StrLst.LoadFromFile('[файл]');
    for i:=0 to StrLst.Count-1 do
      begin
        ADOQuery.SQL.Add(StrLst[i]);
        if((j>0) and(pos(StrLst[i],'Select'))or(pos(StrLst[i],'SELECT'))or(pos(StrLst[i],'Update'))or(pos(StrLst[i],'UPDATE'))or...)then//перечисли с чего могут начинаться запросы... 
        begin
        try
          ADOQuery.ExecSQL;
        except
        end;
         ADOQuery.SQl.Clear;
        end;
        inc(j);
      end;
  finally
    StrLst.Free;
  end;
end;

PM MAIL WWW Skype GTalk YIM MSN   Вверх
fess
Дата 7.1.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Цитата(Rodman @  7.1.2007,  21:46 Найти цитируемый пост)
fess, кто формирует этот файл с запросами??? 

Сложно сказать))) эти файлы скачиваются откуда-то из инета... Скорее всего - просто экспорт из MySql.... Их несколько... Все их надо применить для базы... Структура-то у них нормальная... Запрос и должен заканчиваться точкой с запятой... 

Цитата(Rodman @  7.1.2007,  21:46 Найти цитируемый пост)
вот еще в голову пришло...

Я говорил, что это не прокатит... по ключевым словам... Т.к. в запросе может быть строка, в которой есть это ключевое слово... И регистр неизвестен... 
Я думаю, что проблема даже не в парсинге... Как-то же можно передать много запросов в одном? Или никак?
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Vas
Дата 8.1.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(fess @  7.1.2007,  21:40 Найти цитируемый пост)
там в запросах могут быть ";" и как определить,

Не могут быть, только в конце запроса, иначе сами подумайте как бы MySQL понимал ";" в середине скрипта. В MySQL как я знаю ";" и есть признак окончания всего запроса. Вот по ним и орентируйтесь.

Добавлено @ 10:40 
Цитата(fess @  7.1.2007,  23:03 Найти цитируемый пост)
Или никак? 

Никак, токи парсить самому.

Это сообщение отредактировал(а) Vas - 8.1.2007, 10:39


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Sansa
Дата 8.1.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 18.10.2006
Где: Королев

Репутация: 2
Всего: 6



Попробуй использовать ZeosDBO. Он самостоятельно разбирает введенные SQL команды.
--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
Rodman
Дата 8.1.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



fess, все равно надо знать структуру файла...
Цитата(Vas @  8.1.2007,  09:38 Найти цитируемый пост)
могут быть, только в конце запроса, иначе сами подумайте как бы MySQL понимал ";"

так что распарсить все равно можно...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
fess
Дата 8.1.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Цитата(Vas @  8.1.2007,  10:38 Найти цитируемый пост)
Не могут быть, только в конце запроса, иначе сами подумайте как бы MySQL понимал ";" в середине скрипта. В MySQL как я знаю ";" и есть признак окончания всего запроса. Вот по ним и орентируйтесь.

Пример запроса с ';' внутри:
Код

UPDATE quest_template SET OfferRewardText='These armor kits are of solid quality, $N. If there is one thing I demand in not only my work, but the work of those in my employ, it is quality.$B$BYou\'ve done well to earn this pattern; I hope it brings you the rewards it has brought me. $B$BGains', RequestItemsText='Do you have the six thick armor kits and the wildvine I require?$B$BDon\'t think of making armor kits as monotonous work; the steady fashioning method you develop as you ply your trade on these kits helps develop your skills for the intricate work needed to make Wild Leather armor.$B$BSee - there\'s a real reason behind what you\'re making for me...', prevquestid=2847 WHERE entry = 2848;


Я примерно догнал, как парсить)) Спасибо,Vas и Rodman  за идею! В общем, точка с запятой должна быть последним символом в строке - тогда это запрос)) Вроде, пока получается) Хотя, это тоже не совсем корректно (т.к. а если 2 запроса в строке будут?)


Цитата(Sansa @  8.1.2007,  11:26 Найти цитируемый пост)
Попробуй использовать ZeosDBO. Он самостоятельно разбирает введенные SQL команды. 

Попробую)) Просто хотелось обойтись стандартными компонентами...


Это сообщение отредактировал(а) fess - 8.1.2007, 13:45
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
Vas
Дата 8.1.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



";" может еще встречаться в сердине запроса но как строковое значение то бишь ';' вот, так что дело за маленьким парсить строку посимвольно и учитывать открыт " ' " или нет, если открыт и встретили ";" то пропускаем это не окончание запроса и так далее  smile 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
SergeBS
Дата 10.1.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



fess, 
У тебя НИКОГДА не получится выполнить несколько запросов "за 1 раз", т.е. за 1 загрузку Query. Подробности - в статье на DelphiKingdom, которая как-то так и названа - "Выполнение нескольких SQL-запросов" (точно не помню - сам ищи). Суть: после выполнения возвращается число, для 1 запроса оно равно 1, и только оно считается правильным. Если запросов 2 в одном запуске Query, вернется 2 - это считается ошибкой. 
Так что ищи/делай парсер. Или иди другим путем.
PM MAIL   Вверх
fess
Дата 10.1.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 17.2.2005
Где: г. Мурманск, Росс ия

Репутация: нет
Всего: 3



Цитата(SergeBS @  10.1.2007,  18:53 Найти цитируемый пост)
Или иди другим путем. 

Например, каким?
--------------------
Компьютер не подчиняется законам физики. Только в нём глюки возникают из ничего, файлы исчезают в никуда, а объём измеряется в метрах и называется весом.
PM MAIL ICQ   Вверх
SergeBS
Дата 11.1.2007, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



fess, 
Цитата
 эти файлы скачиваются откуда-то из инета... 

Вот и разберись с этим - откуда и почему так. Сам попробуй скачивать в нужном тебе формате, выпытав у заказчика источник. А ежели заказчик признаваться не хочет - ну так и флаг ему в руки, пусть сам ручками парсит и вкачивает. Самый прямолинейный способ.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0860 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.