Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 避免在TDataSet中添加重复的列名_Delphi_Pascal_Tdataset - Fatal编程技术网

Delphi 避免在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

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

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。