table['字段']
table.fieldbyname('字段')
table.fieldvalues['字段']
这三种方法想必大家都用过,我在网上也查找了一些关于三者的资料,
有人说table['字段']简短、扩充性好,table.fieldvalues['字段']好是borland
推荐的使用方法,table.fieldbyname('字段')过时了等。
我在使用中也有这方面的感觉。
在我有一个问题不太明白, 在用table.fieldbyname('字段')的时候,字段值可以
变换类型,如table.fieldbyname('字段').asstring,
还有一点,在给一个变量赋值的时候,用table.fieldvalues['字段']的话,
如果字段值为空则会出错,而用table.fieldbyname('字段').asstring将会得到一个
空值,从而不会弹出错误,我不知道为什么table.fieldbyname('字段')这种方法不好,谁能帮我解释一下吗?
谢了!

解决方案 »

  1.   

    我覺得差不多吧﹐我習慣用table.fieldbyname('字段')  ---有時覺得就是慢了點吧。
      

  2.   


    table['字段']

    table.fieldvalues['字段']
    可以不用考虑返回的类型
    前提是不能为空:)
      

  3.   

    function TDataSet.FieldByName(const FieldName: string): TField;
    begin
      Result := FindField(FieldName);
      if Result = nil then DatabaseErrorFmt(SFieldNotFound, [FieldName], Self);
    end;    property FieldValues[const FieldName: string]: Variant read GetFieldValue write SetFieldValue; default;
      

  4.   

    procedure TDataSet.SetFieldValue(const FieldName: string;
      const Value: Variant);
    var
      I: Integer;
      Fields: TList;
    begin
      if Pos(';', FieldName) <> 0 then
      begin
        Fields := TList.Create;
        try
          GetFieldList(Fields, FieldName);
          for I := 0 to Fields.Count - 1 do
            TField(Fields[I]).Value := Value[I];
        finally
          Fields.Free;
        end;
      end else
        FieldByName(FieldName).Value := Value;
    end;
      

  5.   

    有没有类似vartostrdef()的函数啊?
      

  6.   

    function TDataSet.GetFieldValue(const FieldName: string): Variant;
    var
      I: Integer;
      Fields: TList;
    begin
      if Pos(';', FieldName) <> 0 then
      begin
        Fields := TList.Create;
        try
          GetFieldList(Fields, FieldName);
          Result := VarArrayCreate([0, Fields.Count - 1], varVariant);
          for I := 0 to Fields.Count - 1 do
            Result[I] := TField(Fields[I]).Value;
        finally
          Fields.Free;
        end;
      end else
        Result := FieldByName(FieldName).Value
    end;
    其他的就不帖了,在DB的TDataSet内
    你可以看到table['字段']就是调用table.fieldvalues['字段'],而table.fieldvalues['字段']又调用FieldByName,不同的是返回的类型。
      

  7.   

    1 由于返回的是value所以不能为空
    2 按照teamB的建议,最好不用astring等会引起空值,用asvariant
    3 有啊
    Delphi syntax:
    function VarToStrDef(const V: Variant; const ADefault: string): string;