3

我有一个连接到 TDataSetProvider 的 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;

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

我有什么办法可以捕获此错误并将其很好地报告给用户。或者,有没有办法在执行 SQL 查询之前验证它的语法?

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

4

4 回答 4

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 异常。

于 2010-05-13T14:22:35.850 回答
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;
于 2010-05-13T14:10:48.823 回答
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;
于 2010-05-13T14:19:27.430 回答
0
  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 查询的语法。因为,那么您将需要重现 DBMS 解析器行为,这是一项复杂的编程任务。更简单的是向 DBMS 提交命令,希望它是正确的(乐观的方法)。
于 2010-05-13T07:52:41.690 回答