我使用以下代码动态地向TDataSet添加字段:
while not ibSQL.Eof do
fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString);
TDataSet.FieldDefs.Add(fieldname , ftString, 255);
end问题是,我可能会得到重复的名字,所以什么是最简单的方法,以筛选复制,而不是添加的副本,已经添加。
我希望不要遍历添加的每一列的TDataSet.FieldDefList,因为这对于每一列的添加都是乏味的。可能会有很多新的东西。
如果可能的话,请提供另一个解决方案。如果没有,那么我就被困在使用FieldDefList迭代了。
我还将补充一点,在SQL查询中筛选重复项是一个选项,而不是所需的选项。
谢谢
发布于 2014-04-08 18:51:20
TFieldDefs有一个方法IndexOf,当不存在具有给定名称的字段时,该方法返回-1。
发布于 2014-04-08 18:48:57
如果我正确地理解了您,最简单的方法可能是将所有现有字段名都放在一个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-08 18:39:45
不管怎么说,我在写完这篇文章的时候都会发这篇文章,但很明显,对查询的筛选是我对这个问题的偏好。
我很难理解你的目标,所以如果我不回答你的问题,请原谅我。而且,我已经有很多年没有经常使用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技巧来消除,这样您就不需要浪费时间在田里玩了。
本质上,这只是做您在源而不是目的地所做的事情,而且更新起来要容易得多。
https://stackoverflow.com/questions/22945412
复制相似问题