问题描述
将数据库表的 VarChar
字段从大小 20
放大到大小 50
后,我必须更新数百个设计时创建的 {{1} 的 Size
属性}} 并且我想一劳永逸地做一次(我不想再做同样的工作,因为很快就会有人决定再次更改字段的大小)。
我想到的最聪明的方法是在运行时设置 TFields
的 TField
属性:
Size
唯一的“问题”是其他程序员会在设计时看到 Object Inspector 的 const
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;只需在该数组中搜索字段的长度。 需要缓存信息,因为通常查询检索列大小很慢。
抱歉,我不能完全发布我的代码,那是一份简历,我希望你能明白:在运行时获取大小并将信息缓存在数组、列表、集合或其他任何东西中。