Ошибки перехвата в TClientDataSet.CommandText - PullRequest
3 голосов
/ 13 мая 2010

У меня есть TClientDataSet, подключенный к TDataSetProvider, который, в свою очередь, подключен к TAdsQuery. Я установил команду SQL и затем открыл ClientDataset примерно так:

try
  CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1';
  CDS.Open
except
  // trap exception here - this never gets executed!
end;

Если оператор SQL в CommandText завершается неудачно, однако (ошибка синтаксиса или что-то еще) я получаю исключение в коде Advantage, но оно никогда не попадает в мой собственный код обработки исключений.

Могу ли я поймать эту ошибку и сообщить о ней пользователю? В качестве альтернативы есть ли способ проверить синтаксис запроса SQL перед его выполнением?

Я использую Delphi Pro 2009 и Advantage Local Server 9.

Ответы [ 4 ]

3 голосов
/ 13 мая 2010

Advantage включает в себя EADSDatabaseError , который предоставит дополнительную информацию о возникшем исключении.

try
  CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1';
  CDS.Open
except
on E: EDatabaseError do
begin
  if ( E is EADSDatabaseError ) then
  begin
    ErrorString := (E as EADSDatabaseError).SQLErrorCode + E.Message;
    application.messagebox ( pchar(ErrorString), 'Advantage Database Error', 0 )
  end
  else
    application.messagebox (pchar(E.message), 'Native Database Error', 0 );
  end;
end;

Вы можете проверить синтаксис оператора SQL перед его выполнением, используя метод VerifySQL компонента TAdsQuery. Это вызовет исключение EADSDatabaseError, если синтаксис SQL неверен.

2 голосов
/ 13 мая 2010

Получаете ли вы код исключения (а не захваченное исключение, которое вам нужно), когда вы запускаете его из среды IDE, или также когда вы запускаете его из исполняемого файла напрямую? Причина, по которой я спрашиваю, состоит в том, что IDE сначала сообщит об ошибке / исключении, и если вы не продолжите, вы никогда не увидите фактическую ловушку исключения.

Возможно отключить перехват IDE для определенных типов ошибок, хотя в среднем я не люблю этого делать. Вы можете проверить, не в этом ли проблема, запустив приложение самостоятельно, за пределами Delphi IDE.

Кроме того, код, который вы изначально написали, должен предотвращать всплытие всех ошибок на поверхность, что, вероятно, не то, что вам нужно. Точно так же, если вы хотите, чтобы оно выглядело лучше, вы можете отобразить сообщение, как показано ниже, а затем обработать его.

try 
  CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1'; 
  CDS.Open 
except 
  on E: Exception do begin
    ShowMessage(E.Message);
    // optionally Exit, Abort or what else, to stop execution of the next statements
  end;
end;
1 голос
/ 13 мая 2010

Мне непонятно, почему вы устанавливаете текст команды в TClientDataSet. Я полагаю, если вы установите свойство TAdsQuery.SQL, а затем откроете TClientDataSet, вы получите поведение, которое вы ищете.

Когда я настроил это и запустил ваш код, я получил исключение «Изменения в CommandText не допускаются».

procedure TForm57.Button1Click(Sender: TObject);
begin
  try
   CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1';
   CDS.Open;
  except
    on E : Exception do
      ShowMessage( 'got it:' + E.message );
  end;
end;
0 голосов
/ 13 мая 2010
  1. Чтобы выполнить команду SQL, вы должны использовать TAdsQuery вместо TAdsTable.
  2. Странно, что TAdsTable не возвращает ошибку. Как следует сказать, что-то вроде «Неизвестная таблица».
  3. Чтобы перехватить ошибку и сообщить о ней пользователю:
    
        try 
          CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1'; 
          CDS.Open 
        except 
          on E: Exception do begin
            Application.HandleException(Self);
            // optionally Exit, Abort or what else, to stop execution of the next statements
          end;
        end;
    
  4. Не существует простого способа проверить синтаксис запроса SQL. Потому что тогда вам нужно будет воспроизвести поведение анализатора СУБД, что является сложной задачей программирования. Проще всего подать команду в СУБД в надежде, что она правильная (оптимистичный подход).
...