鉴于不推荐使用ShortString,限制字符串长度的最佳方法是什么

Nic*_*ges 5 delphi string field

拥有这样的记录并不罕见:

TAddress = record
  Address: string[50];
  City   : string[20];
  State  : string[2];
  ZIP    : string[5];
end;
Run Code Online (Sandbox Code Playgroud)

拥有硬编码字符串大小以确保字符串大小不会超过为数据分配的数据库字段大小.

但是,鉴于该ShortString类型已被弃用,Delphi开发人员正在做什么来"解决"这个问题?声明记录字段string可以完成工作,但不能保护数据不超过正确的长度.

这里最好的解决方案是什么?

Dav*_*nan 6

你问题中的短字符串类型并不能真正保护字符串不超过正确的长度.为这些短字符串分配较长的值时,将以静默方式截断该值.

我不确定你使用的是什么数据库访问方法,但我想它会做同样的事情.即将任何超长字符串截断为最大长度.在这种情况下,无所事事.

如果数据库访问方法在为其提供超长字符串时抛出错误,则需要在将值传递给数据库之前进行截断.

如果必须明确截断,那么有很多地方可以选择这样做.我的理念是在最后可能的时刻截断.这就是你受限制的点.截断任何其他地方似乎是错误的.这意味着数据库限制正在扩展到与数据库无明显关系的代码部分.

当然,所有这些都是基于您希望继续进行静默截断的假设.如果您想在截断的情况下提供用户反馈,那么您需要确定反馈的正确行动点.

  • 如果字符串是用户输入的,那么您需要尽早提供截断信息,即UI.在其他任何地方执行此操作只会使用户暴露于神秘的开发者消息或数据丢失. (5认同)

Mas*_*ler 5

如果我不得不保持数据超出正确的长度,我会让数据库代码尽可能地处理它.对字段设置大小限制,并在数据绑定控件中向用户显示数据.甲TDBEdit绑定到一个字符串字段将正确执行长度限制.设置它以便直接从数据集填充记录,并且它将始终具有正确的长度.

然后,您需要担心的是数据是从某些外部源(即不属于您的UI)进入记录的.为此,使用相同的过程.让导入代码将数据插入到数据集中,并让其长度限制为您进行验证.如果它引发异常,则拒绝导入.如果没有,那么您将获得一个有效的数据集行,您可以使用该行来填充记录.