我有一个连接到 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。

有帮助吗?

解决方案

优点包括 EADS数据库错误 这将提供有关引发的异常的更多信息。

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 语句之前检查其语法,方法是使用 验证SQL TAdsQuery 组件的方法。如果 SQL 语法不正确,这将引发 EADSDatabaseError 异常。

其他提示

您是否收到,当你在IDE中运行这个,或者也可以当你从你的可执行文件直接运行异常代码(不是捕获的异常,你想要的)?我想问的原因是,IDE会首先报告错误/例外,如果你不继续下去,你永远不会看到实际的exeception陷阱。

有可能关闭IDE俘获某些错误类型,虽然我不喜欢这样做,平均。你可以检查,看看是否是这样的问题,通过自身运行应用程序,德尔福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;

它为什么要设置上的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;
  1. 执行命令,必须使用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 query.因为,那么将需要再生一个DBMS析程序的行为,什么是一个复杂的程序的任务。更简单的是提出命令DBMS,希望,认为它是正确的(乐观的方法)。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top