1

TField.origin プロパティを使用して、SQL クエリの where 句を動的に作成します。

したがって、次のようなクエリがあるとします。

select
  p.firstname,
  p.lastname,
  g.description
from
  people p
  inner join groups g

firstname フィールドのオリジンを次のように設定できます。

FirstNameField.origin = 'p.firstname';

次に、これを次のような動的クエリの where 句で使用します。

SQLWhere = 'where ' + FirstNameField.origin + ' = ''' + MyValue + ''' ';

(明らかに、SQL インジェクションを防ぐための追加のコードがあります)。

私はこれをいつもやっていますが、うまくいきます。ただし、バグを追跡しようとすると、原点の値をリセットし続けるデータセットが 1 つあることに気付きました。

people.firstname

それ以外の;

p.firstname

データセットが閉じられてから再び開かれるまで追跡しました。ただし、私はこれを常に行っているため、1 つのデータセットの動作が異なる理由を理解できません。

私の質問は、元の値がリセットされないようにするにはどうすればよいですか?

4

1 に答える 1

3

以下のコードは、D7 の IBCustomDataSet ユニットからのものです (コードは、後の XEx バージョンではより複雑になります)。

OriginIBX TFieldのプロパティを設定するのはこのコードです。

TIBCustomDataSet.CreateFields は、フィールドが TrueのInternalOpen 場合、データセットがそのメソッドを呼び出すときに呼び出されます。データセットのエントリがゼロの 場合FDefaultFields、True になります。ユーザー コードまたは IDE でデータセットのフィールド エディターを使用して事前にフィールドが作成されていない場合、0 になります。 メソッドを介して TDataSet.Open によって呼び出されます。InternalOpenFieldCountFieldCountInternalOpenOpenCursor

そのため、'CreateFields' が実行Origin され、結果としてデータセット フィールドのプロパティがリセットされるのを回避する方法は、データセットを開く前に、これらの方法 (IDE またはユーザー コード) のいずれかを使用してフィールドを作成することです。つまり、Originこれらの方法のいずれかでプロパティを設定すると、リセットされるのを回避できます。

procedure TIBCustomDataSet.CreateFields;
var
  FieldAliasName, RelationName : String;
  i : Integer;
  f : TField;
begin
  inherited;
  for i := 0 to FQSelect.Current.Count - 1 do
    with FQSelect.Current[i].Data^ do
    begin
      { Get the field name }
      SetString(FieldAliasName, aliasname, aliasname_length);
      SetString(RelationName, relname, relname_length);
      f := FindField(FieldAliasname);
      if Assigned(f) then
      begin
        if (RelationName <> '') and (FieldAliasName <> '') then
          f.Origin := RelationName + '.' + FieldAliasName;
      end;
    end;
end;

更新 TIBCustomDataSet.InternalOpen の実装は、XE4 と XE6 の間で明らかに変更されたため、CreateFields は無条件で呼び出されるようになりました (つまり、DefaultFields が True であるかどうかに関係なく)。したがって、既存の TFields を使用しても、CreateFields が呼び出されて Origin プロパティがリセットされることは避けられません。

于 2015-08-27T17:41:28.867 に答える