陷阱TClientDataSet.CommandText中的错误

时间:2010-05-13 02:52:45

标签: delphi exception-handling delphi-2009 advantage-database-server tclientdataset

我有一个连接到TDataSetProvider的TClientDataSet,后者又连接到TAdsQuery。我设置了SQL命令,然后打开ClientDataset,如下所示:

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

但是,如果CommandText中的SQL语句失败(语法错误或其他),我在Advantage代码中会遇到异常,但它永远不会被我自己的异常处理代码捕获。

我有什么方法可以捕获此错误并向用户报告。或者有没有办法在执行之前验证SQL查询的语法?

我正在使用Delphi Pro 2009和Advantage Local Server 9。

4 个答案:

答案 0 :(得分:3)

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;

您可以在使用TAdsQuery组件的VerifySQL方法执行之前检查SQL语句的语法。如果SQL语法不正确,这将引发EADSDatabaseError异常。

答案 1 :(得分:2)

当您从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;

答案 2 :(得分:1)

我不清楚为什么要在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;

答案 3 :(得分:0)