Delphi 避免在TDataSet中添加重复的列名
我正在使用以下代码向TDataSet动态添加字段:Delphi 避免在TDataSet中添加重复的列名,delphi,pascal,tdataset,Delphi,Pascal,Tdataset,我正在使用以下代码向TDataSet动态添加字段: while not ibSQL.Eof do fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString); TDataSet.FieldDefs.Add(fieldname , ftString, 255); end 问题是,我可能会得到重复的名称,所以什么是最简单的方法来筛选重复的,而不是添加已添加的重复 我希望不要为添加的每一列遍历TDataSet.F
while not ibSQL.Eof do
fieldname := Trim(ibSql.FieldByName('columnnameofchange').AsString);
TDataSet.FieldDefs.Add(fieldname , ftString, 255);
end
问题是,我可能会得到重复的名称,所以什么是最简单的方法来筛选重复的,而不是添加已添加的重复
我希望不要为添加的每一列遍历TDataSet.FieldDefList,因为这对于添加的每一列来说都是乏味的。而且可以有很多补充
如果可能,请提供另一种解决方案。如果没有,那么我将无法使用FieldDefList迭代
我还要补充一点,在SQL查询中筛选出重复项是一个选项,但不是期望的选项
谢谢在我写完这篇文章后,我仍然会发布这篇文章,但很明显,在查询中筛选是我对这个问题的偏好 我在理解你的目标方面有点困难,所以如果我没有回答你的问题,请原谅我。而且,我已经多年没有经常使用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技巧来消除,这样你就不需要浪费时间来处理字段了
本质上,这只是在源位置而不是在目标位置执行的操作,更新起来要容易得多。如果我理解正确,最简单的方法可能是将所有现有字段名放在
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;
我要做的是将一个
TStringList
与排序:=true
和重复:=dupError
集一起保存。对于每个字段,在try块中执行myStringList.Add(大写(FieldName));
,如果它抛出异常,您就知道它是重复的
TStringList
确实是一个功能极其广泛的类。你能找到它的所有用途总是有点令人惊讶…TFieldDefs
有一个方法IndexOf
,当不存在具有给定名称的字段时,该方法返回-1
。你应该用TStrings.I检查异常,而不是捕获异常ndexOf
如果它只是您需要的字段名,您可以简单地将Stringlist Duplicates设置为dupIgnore,并在循环后创建迭代Stringlist的FieldDefs。顺便说一句,除非您将CaseSensitive设置为true,否则您不需要大写。尽管您描述了一种在查询中调整列名的有效方法,但这与pr无关问题中描述的问题。如果您查看提供的源代码,您可以看到结果集是迭代的,其中“字段名”取自一列的内容。实际上是“字段名”表示检索到的数据。是的,与问题无关。数据中的冲突是可以接受的,如果您注意到,我会将许多垂直数据列转换为一个宽的水平行。这更复杂,但通常情况下就是这样。我尝试了查找方法,但在第一次尝试查找时会显示GUI消息hat显示“Field”columnnameofchange“not Found”,然后过程停止运行,不再处理SQL中的任何记录。如果fDataSet.FieldDefs.Find(fieldname)=nil,则fDataSet.FieldDefs.Add(fieldname,ftString,255);你是对的。我一定是被继承的TDefCollection的Find方法误导了。在这种情况下,最好尝试IndexOf并检查-1。