powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Несколько команд в одном запросе.
7 сообщений из 7, страница 1 из 1
Несколько команд в одном запросе.
    #32682145
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите можно ли выполнить несколько комманд в одном запросе? Запросы вызываются через TADOQuery.ExecSQL; Записываются в поле TADOQuery.SQL.Add('текст команды ');
Или это невозможно?
...
Рейтинг: 0 / 0
Несколько команд в одном запросе.
    #32682233
Arick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Впринципе, возможно, сделай просто методом тыка:
TADOQuery.SQL.Add('SELECT * FROM table1; SELECT * FROM table2');
Надо только их разграничить ';'
И помни, что если таблички поддерживают транзакции, то надо между разными запросами ставить COMMIT
А чем тебе не походит ситуация:
TADOQuery.SQL.Add('query1');
TADOQuery.SQL.Open; //ExecSQL в зависимости от запроса
TADOQuery.SQL.Clear;
TADOQuery.SQL.Add('query2');
TADOQuery.SQL.Open; //ExecSQL в зависимости от запроса

????????????
...
Рейтинг: 0 / 0
Несколько команд в одном запросе.
    #32682253
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опишу проблему детальнее:
1. Есть программа под MSSQL, которая стучится через АДО к своему серверу.
2. Нужно переделать ее на MySQL.
3. Запрсы простые и MySQL явно поддерживаются
4. Одна проблема есть ОГРОМНАЯ КУЧА запросов типа:

DELETE FROM table1 WHERE j>2;
INSETT INTO ... ;
UPDATE fff SET h=4;

которые выполняются в одном TADOQuery. Т.е. ; они уже разделены, но MySQL кричит, что немогет он такое выполнить.
...
Рейтинг: 0 / 0
Несколько команд в одном запросе.
    #32682907
Arickkkkk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не пробовал через ADO, но напрямую работает. (в MySQL4)
Может это не глюк сервера, а глюк Адо?
...
Рейтинг: 0 / 0
Несколько команд в одном запросе.
    #32682945
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArickkkkkНе пробовал через ADO, но напрямую работает. (в MySQL4)
Может это не глюк сервера, а глюк Адо?
Может это и так, "но разве от этого легче?"(с).
На сегодняшний день проблему решил следующим образом - на обработчик события OnWillExecute TADOConnection поставил обработчик, который базово парсит предварително комманду, и если в комманде больше чем один SQL стейтмент каждый из стейтментов выполняется в отдельной TADOCommand. Ессно, при этом перед пакетом делается BeginTrans; И в зависимости от успешности промежуточных результатов делается в конце или commit или Rollback. Отлажу код - сделаю пост в этой теме.
...
Рейтинг: 0 / 0
Несколько команд в одном запросе.
    #32683118
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот обещанный код. Если кто знает, как сделать лучше - пишите, буду рад.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
function ExtractStringsPro(Separators, WhiteSpace: TSysCharSet; Content: PChar;
  Strings: TStrings): Integer;
var
  Head, Tail: PChar;
  EOS, InQuote: Boolean;
  QuoteChar: Char;
  Item: string;
begin
  Result :=  0 ;
  if (Content = nil) or (Content^=# 0 ) or (Strings = nil) then Exit;
  Tail := Content;
  InQuote := False;
  QuoteChar := # 0 ;
  Strings.BeginUpdate;
  try
    repeat
      while Tail^ in WhiteSpace do Inc(Tail);
      Head := Tail;
      while True do
      begin
        while (InQuote and not (Tail^ in [QuoteChar, # 0 ])) or
          not (Tail^ in Separators + [# 0 , '''', '"']) do Inc(Tail);
        if Tail^ in ['''', '"'] then
        begin
          if (QuoteChar <> # 0 ) and (QuoteChar = Tail^) then
            QuoteChar := # 0 
          else QuoteChar := Tail^;
          InQuote := QuoteChar <> # 0 ;
          Inc(Tail);
        end else Break;
      end;
      EOS := Tail^ = # 0 ;
      if (Head <> Tail) and (Head^ <> # 0 ) then
      begin
        if Strings <> nil then
        begin
          SetString(Item, Head, Tail - Head);
          Strings.Add(Item);
        end;
        Inc(Result);
      end;
      Inc(Tail);
    until EOS;
  finally
    Strings.EndUpdate;
  end;
end;

procedure TdmMain.adcMainWillExecute(Connection: TADOConnection;
  var CommandText: WideString; var CursorType: TCursorType;
  var LockType: TADOLockType; var CommandType: TCommandType;
  var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
  const Command: _Command; const Recordset: _Recordset);
var
 str:string;
 sl:TStringList;
 scs,scw:TSysCharSet;
 r:integer;
 i:integer;
begin
try
{$IFDEF MYSQL}
  str:=CommandText;
  scs:=[';'];
  scw:=[];
  sl:=TStringList.Create;
  r:=ExtractStringsPro(scs,scw, PChar(str), sl);
  if r> 1  then
   begin
     try
       adcMain.BeginTrans;
         for i:= 0  to sl.Count- 1  do
          begin
            r:=length(sl.Strings[i]);
      //      MessageBox( 0 ,PChar(sl.Strings[i]),'',MB_OK);
            if r< 4  then continue;
            acMy.CommandText:=sl.Strings[i];
            acMy.Execute;
          end;
       adcMain.CommitTrans;
     except
      on e:Exception do
       begin
         MessageBox( 0 ,PChar(E.Message),'',MB_OK);       
         adcMain.RollbackTrans;
       end;  
     end;
//           MessageBox( 0 ,PChar(str),'',MB_OK);
    CommandText:='SELECT 0';
   end;
  sl.Free;
{$ENDIF}
except
 on E:Exception do
  begin
    MessageBox( 0 ,PChar(E.Message),'',MB_OK);
  end;
end;
end;

...
Рейтинг: 0 / 0
Несколько команд в одном запросе.
    #32683723
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArickkkkkНе пробовал через ADO, но напрямую работает. (в MySQL4)
Может это не глюк сервера, а глюк Адо?

Напрямую он выполняет их потому что консольный клиент сам их делит по ';' и по одному посылает их на сервер. Клиентские либы этого не делают (и слава богу что не делают).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Несколько команд в одном запросе.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]