如何正确判断数据库字段是否允许为NULL值?Delphi检测问题
为什么
TField.Required不能反映字段的非空约束 TField.Required本质是客户端侧的校验控制属性,不是数据库字段元数据的映射:
- 该属性可以在字段设计器、运行时代码中被任意修改,修改结果仅影响客户端提交数据前的非空校验逻辑,不会对数据库端的字段约束产生任何作用
- 绝大多数Delphi数据访问驱动在打开数据集生成动态字段时,不会主动将数据库端的非空约束同步到这个属性上,因此你读取到false属于正常表现,不是组件bug。
检测字段是否允许为NULL的正确方案
根据你使用的数据访问组件,选择对应的方式即可:
- ADO组件(TADOQuery、TADODataSet)
读取字段的Attributes属性集合,判断是否包含faNullable标记,该值由驱动直接从数据库元数据读取,和实际表结构一致:function IsFieldNullable(Field: TField): Boolean; begin Result := faNullable in Field.Attributes; end; - FireDAC组件(Delphi当前主流官方数据访问层)
FireDAC对字段元数据做了专门封装,将目标字段转为TFDField类型后读取AllowNull属性即可:function IsFieldNullable(Field: TField): Boolean; begin Result := (Field is TFDField) and TFDField(Field).AllowNull; end; - 全组件通用兼容方案
如果使用BDE、dbExpress等老旧组件,或是遇到驱动元数据映射异常的极端场景,可以直接查询数据库标准信息架构表获取最权威的字段定义,兼容SQL Server、MySQL、PostgreSQL等主流数据库的查询写法如下:
查询返回SELECT IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '目标表名' AND COLUMN_NAME = '待检测字段名'YES代表字段允许为NULL,返回NO代表字段设置了非空约束。
注意:不要通过手动修改
TField.Required的方式对齐数据库约束,该属性仅生效于客户端校验层,既不会感知数据库端的结构变更,也不会反向修改数据库的字段约束规则。
内容的提问来源于stack exchange,提问作者Frank Pedro
相关产品推荐
相关产品推荐

