捕获 TClientDataSet.CommandText 中的错误
题
我有一个连接到 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;
- 执行命令,必须使用TAdsQuery而不是TAdsTable.
- 奇怪的是,这TAdsTable不会返回一个错误。因为它应该希望再次喜欢的东西"不明表"。
- 陷阱的一个错误,并报告给用户:
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;
- 没有简单的方法来验证该法的SQL query.因为,那么将需要再生一个DBMS析程序的行为,什么是一个复杂的程序的任务。更简单的是提出命令DBMS,希望,认为它是正确的(乐观的方法)。