sql server中:
1 可以用存储过程sp_Columns
2 Table1.Fields[0].Value := '';
  Table.Post;
  if (len(VarToStr(Table1.Fields[0].Value)) > 0 )then // char

解决方案 »

  1.   

    自己写一个函数来判断。如下
    function tytostr(ty:tfieldtype):string;
    var dt:string;
       vdt:variant;
    begin
       vdt:=ty;
       dt:=string(vdt);
       result:=dt;
    end;
    然后找一个含有VARCHAR字段和CHAR字段的DB2表。
    用以下语句。
    showmessage(tytostr(table1.fieldbyname('varchar字段名').datatype));
    showmessage(tytostr(table1.fieldbyname('char字段名').datatype));
    从显示的数字就可以看出类型了,不过要注意,数字是以0开头的,所以显示0表示的是第一个ftunknow.显示6表示的是第七个ftfloat,就是你打出的表上的顺序。
      

  2.   

    自己写一个函数来判断。如下
    function tytostr(ty:tfieldtype):string;
    var dt:string;
       vdt:variant;
    begin
       vdt:=ty;
       dt:=string(vdt);
       result:=dt;
    end;
    然后找一个含有VARCHAR字段和CHAR字段的DB2表。
    用以下语句。
    showmessage(tytostr(table1.fieldbyname('varchar字段名').datatype));
    showmessage(tytostr(table1.fieldbyname('char字段名').datatype));
    从显示的数字就可以看出类型了,不过要注意,数字是以0开头的,所以显示0表示的是第一个ftunknow.显示6表示的是第七个ftfloat,就是你打出的表上的顺序。
      

  3.   

    难道这个办法不好吗?本来这个东西就是系统之间的约定,你只要一次性的找出来
    以后就可以直接用了嘛,比如char字段显示为1,表示ftstring。以后,只要判断出某DB2表的某字段的datatype=ftstring,就表示是char类型的字段了。又不是要你在编程时,到处都去用这个方法来判断。
      

  4.   

    如果你只是想区分varchar和char的话,可能除了判断这个以外,还要判断
    datasize,因为有可能它们的datatype在dbgrid里是一样的。我这里没有DB2的表,所以无法试。不过我想这两个参数可能已经够了
      

  5.   

    有个最简单的方法:查找系统表 (对ORacle而言DB2我没用过)
    select * from col;
      

  6.   

    我 觉得 windindance(风舞轻扬) (  ) 思路最好,
    由数据库服务器判断是最准确的
      

  7.   

    你只要用DBGrid的Columns[i].field.DataType 即可得到每个列的数据类型了
      

  8.   

    上面灰不遛秋提到的,有些疑问:TFileType里根本就没有Varchar和Char,所以也根本判断不出来。
      

  9.   

    用ADO似乎可以  DataTypeEnum (李维书中有详例)
    以下为李维书中代码,仅供参考:
    function TfrmMain.GetADOXFieldType(aType : DataTypeEnum): String;
    begin
      case aType of    //
        adEmpty : Result := 'adEmpty';
        adTinyInt : Result := 'adTinyInt';
        adSmallInt : Result := 'adSmallInt';
        adInteger : Result := 'adInteger';
        adBigInt : Result := 'adBigInt';
        adUnsignedTinyInt : Result := 'adUnsignedTinyInt';
        adUnsignedSmallInt : Result := 'adUnsignedSmallInt';
        adUnsignedInt : Result := 'adUnsignedInt';
        adUnsignedBigInt : Result := 'adUnsignedBigInt';
        adSingle : Result := 'adSingle';
        adDouble : Result := 'adDouble';
        adCurrency : Result := 'adCurrency';
        adDecimal : Result := 'adDecimal';
        adNumeric : Result := 'adNumeric';
        adBoolean : Result := 'adBoolean';
        adError : Result := 'adError';
        adUserDefined : Result := 'adUserDefined';
        adVariant : Result := 'adVariant';
        adIDispatch : Result := 'adIDispatch';
        adIUnknown : Result := 'adIUnknown';
        adGUID : Result := 'adGUID';
        adDate : Result := 'adDate';
        adDBDate : Result := 'adDBDate';
        adDBTime : Result := 'adDBTime';
        adDBTimeStamp : Result := 'adDBTimeStamp';
        adBSTR : Result := 'adBSTR';
    //************************************************
        adChar : Result := 'adChar';
        adVarChar : Result := 'adVarChar';
        adLongVarChar : Result := 'adLongVarChar';
        adWChar : Result := 'adWChar';
        adVarWChar : Result := 'adVarWChar';
        adLongVarWChar : Result := 'adLongVarWChar';
    //************************************************
        adBinary : Result := 'adBinary';
        adVarBinary : Result := 'adVarBinary';
        adLongVarBinary : Result := 'adLongVarBinary';
        adChapter : Result := 'adChapter';
        adFileTime : Result := 'adFileTime';
        adPropVariant : Result := 'adPropVariant';
        adVarNumeric : Result := 'adVarNumeric';
      end;    // case
    end;
      

  10.   

    1.取出字段的長度
    2.寫入一個小于此長度的一個數據
    3.取出該數據﹐看最后面有沒有空格即可。(有空格表示VARCHAR類型﹐否則表示CHAR類型。)
      

  11.   

    : wangier(冷眉) 兄,你说“上面灰不遛秋提到的,有些疑问:TFileType里根本就没有Varchar和Char,所以也根本判断不出来。”
    这句话我不敢苟同,这里的tfiletype只是delphi自己使用的类型,而不是只能识别名字为这些的类型,因为如果tfiletype都已经列出了varchar和char的话,我们还用得着讨论这个问题吗?任何类型,只要delphi能识别,它就会读入,然后用以上的tfiletype中的一个来代表。比如以下就是帮助中带的一个转化的例子
    SQL Syntax BDE Logical Paradox dBASE
    SMALLINT fldINT16 Short Numeric(6,0)
    INTEGER fldINT32 Long Long
    DECIMAL fldBCD BCD(32,0) Numeric(20,0)
    DECIMAL(7) fldBCD BCD(32,0) Numeric(7,0)
    DECIMAL(7,2) fldBCD BCD(32,2) Numeric(7,2)
    NUMERIC fldFLOAT Number Double
    NUMERIC(7) fldFLOAT Number Double
    NUMERIC(7,2) fldFLOAT Number Double
    FLOAT fldFLOAT Number Double
    FLOAT(7) fldFLOAT Number Double
    FLOAT(7,2) fldFLOAT Number Double
    CHARACTER(10) fldZSTRING Alpha(10) Character(10)
    VARCHAR(10) fldZSTRING Alpha(10) Character(10)
    DATE fldDATE Date Date
    BOOLEAN fldBOOL Logical Logical
    BLOB(1,1) fldstMEMO Memo Memo
    BLOB(1,2) fldstBINARY Binary Binary
    BLOB(1,3) fldstFMTMEMO Formatted memo Memo
    BLOB(1,4) fldstOLEOBJ OLE OLE
    BLOB(1,5) fldstGRAPHIC Graphic Binary
    TIME fldTIME Time Character(11)
    TIMESTAMP fldTIMESTAMP Timestamp Datetime
    MONEY fldFLOAT, fldstMONEY Money Double
    AUTOINC fldINT32, fldstAUTOINC Autoincrement Autoinc
    BYTES fldBYTES Bytes(1) N/A
    BYTES(10) fldBYTES Bytes(10) N/A 
    这里粘得有点错位,你可以在delphi的local sql帮助中找到“查找data type”
      

  12.   

    function Tfrmquery.FGetFieldType(FieldName: string): Integer;
    begin
            case frmmain.Querymain.FieldByName(fieldname).DataType of
            ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString:
              begin
                Result := 1; //字符型 1
              end;
            ftSmallint, ftInteger, ftWord,
              ftAutoInc, ftLargeInt, ftArray:
              begin
                Result := 2; //整型2
              end;
            ftFloat, ftCurrency, ftBCD:
              begin
                Result := 3; //浮点型(含货币型)3
              end;
            ftDate, ftDateTime:
              begin
                Result := 4; //日期时间型4
              end;
          else
            begin
              Result := 0; //其他未知
            end;      end;
        end;
      

  13.   

    Char对应的DataType 是ftFixChar