我使用以下代码动态地将字段添加到TDataSet:
while not ibSQL.Eof do
fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString);
TDataSet.FieldDefs.Add(fieldname , ftString, 255);
end
问题是我可能会获得重复的名称,因此筛选重复项的最简单方法是什么,而不是添加已添加的重复项。
我希望不要为每个添加的列遍历TDataSet.FieldDefList,因为这对于每个单独的列添加都是乏味的。并且可以有很多新增功能。
如果可能,请提供其他解决方案。如果没有,那么我就陷入使用FieldDefList迭代。
我还要补充一点,在SQL查询上筛选出重复项是一个选项,但不是一个理想的选项。
由于
答案 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 := true
和Duplicates := dupError
。对于每个字段,在try块中执行myStringList.Add(UpperCase(FieldName));
,如果它抛出异常,则表示它是重复的。
TStringList
真是一个非常多才多艺的课程。你可以找到它的所有用途总是有点令人惊讶......