Delphi查询组件忽略错误提示

4

我有一个TADOQuery组件,它使用TADOConnection连接到SQL Server数据库。 现在,当我将下面的SQL添加到组件中,并调用ExecSql时,由于“Create”单词中有拼写错误,它会引发正确的异常。

 exec ('creat1e table myTable 
     (
          col1     TPT_Dt       not null ,
          col2     TPT_FLOAT       not null
     )');

但是,如果我将相同的语句添加到另一个语句中,那么TADOQuery组件将忽略此异常。例如:
 select * from SomeOtherTable where id = 10

 exec ('creat1e table myTable 
     (
          col1     DtDataType       not null ,
          col2     FLOATDataType       not null
     )');

请问为什么Delphi在第二种情况下忽略了异常?我的问题并不在于select语句。即使我添加一个if条件,问题也是一样的;例如:

if not exists (select * from dbo.sysobjects where id = object_id('TABLE1278') and type='U')
begin
 exec ('crea11te table table1278 
     (
          col1     TPT_Dt     
     )');
end

Delphi会直接忽略拼写错误。

提前感谢。

Basil


我猜是因为第一条语句成功了,ADO返回了数据集以及相关的错误信息。 - iMan Biglari
你是否执行 if not exists... 而没有 先执行 select first?如果是这样,那么我无法重现。如果你在之前执行了 select,那么我认为问题出在 SQL 的 exec 上。如果我省略 exec 并使用 crea11te 语句,则会引发错误。我已经使用 ADOCinnection.Execute 进行了测试,并使用了 eoExecuteNoRecords(默认值),这不应该尝试重新运行像 TADOQuery 这样的记录集。无论如何,这是一个有趣的问题。 - kobik
可能与这个问题有关:https://dev59.com/hWPVa4cB1Zd3GeqP7qVb。Microsoft提供的解决方法(`SET NOCOUNT ON`)并没有对我有帮助。 - kobik
1个回答

2

查询生成的所有记录集都会被返回。默认情况下,第一个记录集将被显示,并且会有相应的错误。
您可以通过ADODataSet1.NextRecordset(a)访问所有记录集。

例如,您有以下查询:

select * from TableWhichExists

Select * from TableWichNotExists

你需要获取TableWhichExists的结果。
使用:
procedure TForm1.Button1Click(Sender: TObject);
var
 rs:_RecordSet;
 a:Integer;
begin
  rs := ADODataSet1.NextRecordset(a)
end;

您可以访问下一个记录集并收到相应的错误。

通过存储过程接收多个记录集时,NextRecordset可能非常有用,一次计算所有需要的记录集。

要使用例如三个接收到的结果,您可以按以下方式操作:

procedure TForm1.Button1Click(Sender: TObject);
var
 a:Integer;
begin
  Adodataset2.Recordset := ADODataSet1.NextRecordset(a) ;
  Adodataset3.Recordset := ADODataSet1.NextRecordset(a)
end;

Adodataset1 将显示第一个结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接