Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Несколько команд в одном запросе. / 7 сообщений из 7, страница 1 из 1
06.09.2004, 18:51
    #32682145
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько команд в одном запросе.
Подскажите можно ли выполнить несколько комманд в одном запросе? Запросы вызываются через TADOQuery.ExecSQL; Записываются в поле TADOQuery.SQL.Add('текст команды ');
Или это невозможно?
...
Рейтинг: 0 / 0
06.09.2004, 20:03
    #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
06.09.2004, 20:29
    #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
07.09.2004, 12:01
    #32682907
Arickkkkk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько команд в одном запросе.
Не пробовал через ADO, но напрямую работает. (в MySQL4)
Может это не глюк сервера, а глюк Адо?
...
Рейтинг: 0 / 0
07.09.2004, 12:13
    #32682945
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько команд в одном запросе.
ArickkkkkНе пробовал через ADO, но напрямую работает. (в MySQL4)
Может это не глюк сервера, а глюк Адо?
Может это и так, "но разве от этого легче?"(с).
На сегодняшний день проблему решил следующим образом - на обработчик события OnWillExecute TADOConnection поставил обработчик, который базово парсит предварително комманду, и если в комманде больше чем один SQL стейтмент каждый из стейтментов выполняется в отдельной TADOCommand. Ессно, при этом перед пакетом делается BeginTrans; И в зависимости от успешности промежуточных результатов делается в конце или commit или Rollback. Отлажу код - сделаю пост в этой теме.
...
Рейтинг: 0 / 0
07.09.2004, 13:16
    #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
07.09.2004, 16:00
    #32683723
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько команд в одном запросе.
ArickkkkkНе пробовал через ADO, но напрямую работает. (в MySQL4)
Может это не глюк сервера, а глюк Адо?

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


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