gpt4 book ai didi

delphi - 如何阻止 TField.Origin 重置

转载 作者:行者123 更新时间:2023-12-03 03:26:57 29 4
gpt4 key购买 nike

我使用 TField.origin 属性动态构建 SQL 查询的 where 子句。

因此,如果我有一个查询,例如;

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

我可以将名字字段的原点设置为;

FirstNameField.origin = 'p.firstname';

然后在动态查询的where子句中使用它,例如;

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

(显然我有额外的代码来防止 SQL 注入(inject))。

我一直这样做,而且效果很好。然而,当试图追踪错误时,我注意到我有一个数据集不断将原点的值重置为例如;

people.firstname

而不是;

p.firstname

我追踪到数据集关闭然后重新打开的时间。然而我一直这样做,所以我无法理解为什么一个数据集有不同的行为。

我的问题是如何防止原始值被重置?

最佳答案

下面的代码来自D7的IBCustomDataSet单元(后面的代码会更复杂)XEx 版本)。

正是这段代码设置了 IBX TField 的 Origin 属性。

当数据集调用其 InternalOpen 时,将调用 TIBCustomDataSet.CreateFields方法(如果其 FDefaultFields 字段为 True)。如果进入 InternalOpen 则为 True数据集的 FieldCount 为零。如果没有字段,FieldCount 将为零在用户代码中或使用字段编辑器在 IDE 中提前创建在数据集上。 InternalOpen 由 TDataSet.Open 通过其 OpenCursor 方法调用。

因此,避免执行“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 属性。

关于delphi - 如何阻止 TField.Origin 重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32249639/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com