开阔思路, dbExpress 中处理fn_listextendedproperty 的返回值,取得表中字段的描述性文本。

有一段时间没写博客了,出差了一个星期加上忙着要完成项目系统的任务,

今天写系统时, 在做一个基础性的任务,从 SQL Server 中读取指定表中字段的描述文本,以前用ADO没有问题,现在改用dbExpress 组件,使用 dbExpress 组件读 SQL Server 里的 fn_listextendedproperty 的返回值,返回结果字段 Value 为 TvarBytesField 类型的,

SQL 语句为:

const
  sqlSelecteExtProperty 
= 'SELECT * FROM ::::fn_listextendedproperty (NULL, ''user'', ''dbo'', ''table'', ''%s'', ''column'', default)';

使用dbExpress 组件 TSQLQuery 或 TSQLDataset 都不能直接读取字段"Value"值来,原来fn_listextendedproperty的返回值"Value" 为 'sql_Variant"类型,到DELPHI中为TvarBytesField字段类型, 发现 dbExpress 组件读这个字段的值,不能转换成字符型的,只能用指针型Pointer读取来后再作处理,返回结果不是我需要的,实际上字段"Value"里保存的是表中列的描述性文本 Description。刚开始,我只想到如何用dbExpress 对 TvarBytesField 字段类型来作处理,花了差不多半天的时间来实现如何从TSQLQuery中读取 TvarBytesField 字段里的数据并转换成自己想要的字符,最终还是没有结果,自己走进了死胡同。

最后没办法。吃完晚饭休息一下,呵呵,思路开了,既然 dbExpress 不能很好地处理TvarBytesField,为什么我还一定要用这个类型的呢?我可以将返回结果在返回前先处理一下啊。
改一下:

 

const
  sqlSelecteExtProperty 
= 'SELECT objname as column_name, cast(value as varchar(100)) as column_description FROM ::::fn_listextendedproperty (NULL, ''user'', ''dbo'', ''table'', ''%s'', ''column'', default)';


//执行示范

var
  AQuery: TSQLQuery;
begin
  AQuery:
= TSQLQuery.create;
  AQuery.Connection :
= SQLConnection1;
  AQuery.SQL.Text :
= Format(sqlSelecteExtProperty, ['MyTableName']);
  AQuery.Open;
  ShowMessage(AQuery.FieldByName(
'column_description');
  AQuery.Free;
end;


问题解决了。思路来得太晚了,浪费了我半天时间。不过,最后还是证明了,用dbExpress组件来处理 SQL Server 的一些数据类型返回值时,就不如ADO来得好,比如以前我用
SELECT IDENT_CURRENT('mytablename') 时发现 dbExpress 组件会报错,现在这个BUG听说好像有解决,还没试过。


posted @ 2008-07-18 03:24 陆岛工作室 阅读(...) 评论(...) 编辑 收藏