4

TADOQuery使用して SQL Server データベースに接続されているコンポーネントがありますTADOConnection。ここで、以下の 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 が 2 番目のケースで例外を無視する理由を教えてください。

私の問題は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 は単にタイプミスを無視します。

前もって感謝します。

バジル

4

1 に答える 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 は、プロシージャを介して複数のレコードセットを受け取り、必要なすべてのレコードセットを一度に計算する場合などに便利です。

たとえば、受信した 3 つの結果を使用するには、次のように作業できます。

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

Adodataset1 は最初の結果を表示します。

于 2013-01-15T14:25:04.857 に答える