2

我正在使用以下代码向 TDataSet 动态添加字段:

while not ibSQL.Eof do
   fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString);
   TDataSet.FieldDefs.Add(fieldname , ftString, 255);
end

问题是我可能会得到重复的名称,所以筛选重复项而不添加已添加的重复项的最简单方法是什么。

我希望不要为添加的每一列遍历 TDataSet.FieldDefList,因为这对于每一列添加来说都是乏味的。并且可以有很多补充。

如果可能,请提供另一种解决方案。如果没有,那么我会卡住使用 FieldDefList 迭代。

我还要补充一点,在 SQL 查询中筛选重复项是一个选项,但不是一个理想的选项。

谢谢

4

4 回答 4

5

TFieldDefs具有当具有给定名称的字段不存在时IndexOf返回的方法。-1

于 2014-04-08T18:51:20.480 回答
2

如果我理解正确,最简单的方法可能是将所有现有字段名称放在TStringList. 然后,您可以在添加新字段之前检查是否存在,如果添加它,您只需将名称添加到列表中:

var
  FldList: TStringList;
  i: Integer;
begin
  FldList := TStringList.Create;
  try
    for i := 0 to DataSet.FieldCount - 1 do
      FldList.Add(DataSet.Fields[i].FieldName);

    while not ibSQL.Eof do
    begin
      fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString);
      if FldList.IndexOf(fieldName) = -1 then
      begin
        FldList.Add(fieldName);
        DataSet.FieldDefs.Add(fieldname , ftString, 255);
      end;
      ibSQL.Next;
    end;
  finally
    FldList.Free;
  end;
end;
于 2014-04-08T18:48:57.563 回答
1

无论如何,我在写完它时都会发布它,但显然对查询进行筛选是我对这个问题的偏好。

我在理解您的目标时遇到了一些麻烦,如果我没有回答您的问题,请原谅我。此外,自从我经常使用 Delphi 以来已经有好几年了,所以这绝对不是一个具体的答案。

如果您TADOQuery以我期望的解决方法的方式使用(或您正在使用的任何 TDataSet),则可以执行以下操作:

//SQL
SELECT
  a.field1,
  a....   ,
  a.fieldN,
  b.field1 as "AlternateName"
FROM 
  Table a INNER JOIN Table b
WHERE ...

至于哪一点它会自动使用AlternateName而不是field1(因此您被迫按索引工作或重命名列的冲突。

显然,如果您要打开一个表格来编写这不是一个很好的解决方案。根据我使用 Delphi 的经验,大部分困难都可以通过简单的 SQL 技巧消除,这样您就不需要浪费时间玩这些领域了。

本质上,这只是在源而不是目的地做你正在做的事情,而且更新起来要容易得多。

于 2014-04-08T18:39:45.540 回答
0

我要做的就是保持和TStringList设置。对于每个字段,在 try 块中执行,如果它抛出异常,你就知道它是重复的。Sorted := trueDuplicates := dupErrormyStringList.Add(UpperCase(FieldName));

TStringList真的是一个非常多才多艺的课程。你能找到它的所有用途总是有点令人惊讶......

于 2014-04-08T18:50:32.780 回答