我想实现在delphi的TDBGrid里面,在显示列的时候,若数据库中定义某字段必须有值(或称为必填字段),则将该字段的标题在窗口上加粗;发现有个TFieldDef,required属性貌似是这个,但是结果不行,全部是false;
不使用AdoX能实现吗?就delphi自带的组件属性里?    另,我想获取字段的默认值,在插入新记录时可以把默认值给显示到TDBGrid里面。网上有人说只要数据库中有默认值会自动显示,但我的没有显示,我的TDataSource的AutoEdit是false。谢谢大家帮忙!

解决方案 »

  1.   

    MSSQL里有个表里会纪录下表数据,字段数据,因该可以的,其他的方法不大清楚,期待高人出现
      

  2.   

    select  COLUMN_NAME  from  INFORMATION_SCHEMA.COLUMNS  where  IS_NULLABLE='NO'  and  TABLE_NAME=tablename  这个可以挑出来sql2000里的。但我不希望使用sql来实现。
    直接通过TField或是TFieldDef或是TDataSet的属性、方法,没法实现吗?
      

  3.   

    SQL 2000的:SELECT  top 100 percent *
    from
    ( select d.[name] as TabNm,cast(1 as bit) as NeedUpd, cast(1 as bit) as NeedIns, 
    a.colid as Ord_ID,a.name  as ColName,
    cast(case when (SELECT count(*) FROM sysobjects
    WHERE (name in
               (SELECT name  FROM sysindexes  WHERE (id = a.id) AND (indid in
                        (SELECT indid  FROM sysindexkeys WHERE (id = a.id) AND (colid in
                          (SELECT colid  FROM syscolumns WHERE (id = a.id) AND (name = a.name)))))))
                      AND (xtype = 'PK'))>0 then 1 else 0 end as bit)  as IsKey,
    b.[name] as ColType, case when b.[name]='nvarchar' then a.length/2 else case when b.[name]='numeric' then a.length*2 else a.length end end as ColLen,
    COLUMNPROPERTY(a.id,a.name,'PRECISION') as ColWidth,
    case when isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) >= Isnull(b.Scale,0) then
      isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) - Isnull(b.Scale,0) 
      else isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) end as ColScale,
    cast(a.isnullable as bit) as CanNull, isnull(e.text,'') as DefaultValue,
    cast('' as varchar(50)) as CntNullValue,cast('' as varchar(50)) as MapColumn,cast('' as varchar(50)) as MapExpr,
    cast(COLUMNPROPERTY( a.id,a.name,'IsIdentity') as bit) as IsIdentity,
    cast(COLUMNPROPERTY( a.id,a.name,'IsComputed') as bit) as IsComputed,
    cast(COLUMNPROPERTY( a.id,a.name,'IsRowGuidCol') as bit) as IsRowGuidCol, 
    cast(0 as bit) as noParame,
    cast(g.[value] as varchar(255)) as Re 
    FROM  syscolumns  a
      inner join sysobjects d on a.id=d.id and d.type in('U','V') 
      left join systypes b on  a.xtype=b.xusertype
      left join syscomments e on a.cdefault=e.id
      left join sysproperties g on a.id=g.id AND a.colid = g.smallid  
    )  v
    order by TabNm,Ord_ID-------------------------------------------------------------------------------------------------------------
    SQL 2005用的:SELECT  top 100 percent *
    from
    ( select d.[name] as TabNm,cast(1 as bit) as NeedUpd, cast(1 as bit) as NeedIns,
     a.colid as Ord_ID,a.name  as ColName,
     cast(case when (SELECT count(*) FROM sysobjects
     WHERE (name in
               (SELECT name  FROM sysindexes  WHERE (id = a.id) AND (indid in
                        (SELECT indid  FROM sysindexkeys WHERE (id = a.id) AND (colid in
                          (SELECT colid  FROM syscolumns WHERE (id = a.id) AND (name = a.name)))))))
                      AND (xtype = 'PK'))>0 then 1 else 0 end as bit)  as IsKey,
     b.[name] as ColType, a.length as ColLen,
     COLUMNPROPERTY(a.id,a.name,'PRECISION') as ColWidth,
     case when isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) >= Isnull(b.Scale,0) then
       isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) - Isnull(b.Scale,0)
       else isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) end as ColScale,
     cast(a.isnullable as bit) as CanNull, isnull(e.text,'') as DefaultValue,
     cast('' as varchar(50)) as CntNullValue,cast('' as varchar(50)) as MapColumn,cast('' as varchar(50)) as MapExpr,
     cast(COLUMNPROPERTY( a.id,a.name,'IsIdentity') as bit) as IsIdentity,
     cast(COLUMNPROPERTY( a.id,a.name,'IsComputed') as bit) as IsComputed,
     cast(COLUMNPROPERTY( a.id,a.name,'IsRowGuidCol') as bit) as IsRowGuidCol,
      cast(0 as bit) as noParame,cast(g.[value] as nvarchar(255)) as Re
    FROM  syscolumns  a
      inner join sysobjects d on a.id=d.id and d.type in('U','V')
      left join systypes b on  a.xtype=b.xusertype
      left join syscomments e on a.cdefault=e.id
      left join sys.extended_properties g on a.id=g.major_id and a.colid=g.minor_id
    )  v
    order by TabNm,Ord_ID
      

  4.   

    需要直接使用ADO提供的COM功能实现数据库模式的获取,VCL包装的ADO没有包装这些功能,似乎D2007开始补充些这方面的功能。
      

  5.   

    TFieldDef的required属性是作什么用的呢?
      

  6.   

    dbExpress好像可以获取到字段是否允许为Null,但是不能获取默认值。
      

  7.   

    谢谢gobiz ;
    但是我现在用的都是ADO系统组件,不太想再改到dbExpress
      

  8.   

    ACCESS里面,系统表也没记录是否允许为空和默认值信息.
    看样子得要动用openschema了