集中 TField 的大小值

问题描述

将数据库表的 VarChar 字段从大小 20 放大到大小 50 后,我必须更新数百个设计时创建的 {{1} 的 Size 属性}} 并且我想一劳永逸地做一次(我不想再做同样的工作,因为很快就会有人决定再次更改字段的大小)。

我想到的最聪明的方法是在运行时设置 TFieldsTField 属性:

Size

唯一的“问题”是其他程序员会在设计时看到 Object Inspectorconst C_MY_FIELD_SIZE = 50; ... MyField.Size := C_MY_FIELD_SIZE; 属性中显示的误导性值。 我想知道是否有等效的设计时解决方案

解决方法

是的,我到处都使用 SQL,而不是 TTables,问题之一是编辑框的最大大小。在您的情况下,该大小用于 TField 大小。 好吧,我所做的是在应用程序启动时,对数据库进行查询以获取表的所有字段的大小。在 MsSqlServer 中是:

select table_name,column_name,character_maximum_length 
 from information_schema.columns where data_type='varchar' or data_type='nvarchar' 
 order by TABLE_NAME

该查询返回:所有字段的表名、字段、大小(以字符为单位)。 有了它,例如构建一个数组或一个列表,以在您的应用程序中缓存该信息。

例如,一个数组:

 aLongs[i].sTable:=uppercase(qAux.fields[0].asstring);
 aLongs[i].sField:=uppercase(qAux.fields[1].asstring);
 aLongs[i].iLong:=qAux.fields[2].asinteger;

然后:Function getSize(sMiFieldName:string):integer;只需在该数组中搜索字段的长度。 需要缓存信息,因为通常查询检索列大小很慢。

抱歉,我不能完全发布我的代码,那是一份简历,我希望你能明白:在运行时获取大小并将信息缓存在数组、列表、集合或其他任何东西中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...