避免在TDataSet中添加重复的列名添加

时间:2014-04-08 18:31:35

标签: delphi pascal tdataset

我使用以下代码动态地将字段添加到TDataSet:

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

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

我希望不要为每个添加的列遍历TDataSet.FieldDefList,因为这对于每个单独的列添加都是乏味的。并且可以有很多新增功能。

如果可能,请提供其他解决方案。如果没有,那么我就陷入使用FieldDefList迭代。

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

由于

4 个答案:

答案 0 :(得分:5)

TFieldDefs有一个方法IndexOf,当具有给定名称的字段不存在时,该方法会返回-1

答案 1 :(得分: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;

答案 2 :(得分: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技巧来消除,这样你就不必浪费时间玩这些字段了。

基本上这只是做你在源而不是目的地做的事情,而且更容易更新。

答案 3 :(得分:0)

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

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