首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免在TDataSet中添加重复的列名

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

Stack Overflow用户
提问于 2014-04-08 18:31:35
回答 4查看 1.5K关注 0票数 2

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

代码语言:javascript
复制
while not ibSQL.Eof do
   fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString);
   TDataSet.FieldDefs.Add(fieldname , ftString, 255);
end

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

我希望不要遍历添加的每一列的TDataSet.FieldDefList,因为这对于每一列的添加都是乏味的。可能会有很多新的东西。

如果可能的话,请提供另一个解决方案。如果没有,那么我就被困在使用FieldDefList迭代了。

我还将补充一点,在SQL查询中筛选重复项是一个选项,而不是所需的选项。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-08 18:51:20

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

票数 5
EN

Stack Overflow用户

发布于 2014-04-08 18:48:57

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-04-08 18:39:45

不管怎么说,我在写完这篇文章的时候都会发这篇文章,但很明显,对查询的筛选是我对这个问题的偏好。

我很难理解你的目标,所以如果我不回答你的问题,请原谅我。而且,我已经有很多年没有经常使用Delphi了,所以这肯定不是一个具体的答案。

如果您使用的是TADOQuery (或您正在使用的任何TDataSet ),那么我希望我的解决方法是这样做:

代码语言:javascript
复制
//SQL
SELECT
  a.field1,
  a....   ,
  a.fieldN,
  b.field1 as "AlternateName"
FROM 
  Table a INNER JOIN Table b
WHERE ...

在这一点上,它自动使用AlternateName而不是field1 (因此,您被迫通过索引或重命名列的冲突。

显然,如果您打开一个用于编写的表,这不是一个很好的解决方案。在我使用Delphi的经验中,大多数困难都可以通过简单的SQL技巧来消除,这样您就不需要浪费时间在田里玩了。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22945412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档