1

フォームには、Quantum Grid といくつかの db 対応の editcomponents があります。グリッドに新しいレコードを追加し、グリッドと個別の編集コンポーネントの両方に編集値を入力すると、エラーが発生します。

EOleException: 更新する行が見つかりません。一部の値は、最後に読み取られてから変更された可能性があります

グーグルで調べた後、「Update Criteria」プロパティを adCriteriaAllCols から adCriteriaKey に変更することが正しい解決策であると思います。しかし、いつ、どのように Adonis クエリでそれを行うのでしょうか?

4

6 に答える 6

1

データセットに自動インクリメント フィールドが含まれているか、1 つ以上のフィールドにデフォルト値がある場合、これが問題である可能性があります。Post フィールドを呼び出した後、データベース内の値が変更されますが、データセットによって検出されない場合があります

于 2009-08-02T05:55:09.613 に答える
0

私はAdonisを使用していませんが、TClientDataset(CDS)が主キーを構成するフィールド(プロパティTField.ProviderFlags )を識別するために使用するのと同じメカニズムを使用する可能性があると思います。

探し始めるのに良い場所かもしれないと思います。

于 2009-01-29T18:11:43.327 に答える
0

実際、ADOは、クエリベースの更新(QBU)の動作を制御する動的プロパティを提供します。ほとんどのコードはADOInt.pasでカバーされ、適切なイベントは、レコードセットプロパティ(任意のTADODataSet)のOnAfterOpen、および接続プロパティ(TADOConnection)のOnCreateです。「更新基準」は、更新に使用するフィールドを指定するWHERE句を処理するため、この場合の解決策ではないと思います。'UpdateResync'は次のように変更できます。

//After open a TCustomADODataSet
  TCustomADODataSet(DataSet).Properties['Update Resync'].Value :=
    adResyncAutoIncrement + adResyncUpdates + adResyncInserts;
于 2012-02-04T13:13:38.213 に答える
0

これは古いです。しかし、私の状況は他の誰かに起こるかもしれません。だから私はこの答えを投稿します。

このエラーは私にも起こりました。私はAccessデータベースを使用していて、フォームでTADOTableを使用していました。関係は主従関係であり、すべてのテーブルを IDE デザイナーと一緒に接続しました。私のテーブルはtbl_Floor、tbl_FloorParts、tbl_Seatで、tbl_Floorはtbl_FloorPartsのマスターであり、tbl_FloorPartsはtbl_Seatのマスターでした。したがって、このエラーを解決するために、このトリックを実行しました。

procedure Tfrm_Main.UpdateTblFloor(...);
var
  FID:Integer;
  q:TADOQuery
begin
  FID:=tbl_Floor.FieldByName('FID').AsInteger;
  tbl_Floor.Close;
  q:=TADOQuery.Create(nil);
  try
    q.Connection:=tbl_Floor.Connection;
    q.SQL.Add('Update [Floor]');
    q.SQL.Add(...);//Set Fields that needed to be updated
    q.SQL.Add('where [FID]='+IntToStr(FID));
    q.ExecSQL;  
  finally
    q.free;
  end;
  tbl_Floor.Open;
  tbl_Floor.Locate('FID',FId,[loPartialKey]);
end;

tbl_Floor、tbl_FloorPartsにこれらのイベントを追加しました

procedure Tfrm_Main.tbl_FloorAfterOpen(DataSet: TDataSet);
begin
  tbl_FloorParts.Open;
end;

procedure Tfrm_Main.tbl_FloorBeforeClose(DataSet: TDataSet);
begin
  tbl_FloorParts.Close;
end;

procedure Tfrm_Main.tbl_FloorPartsAfterOpen(DataSet: TDataSet);
begin
  tbl_Seat.Open;
end;

procedure Tfrm_Main.tbl_FloorPartsBeforeClose(DataSet: TDataSet);
begin
  tbl_Seat.Close;
end;
于 2016-04-12T19:30:13.097 に答える