我该如何创建独特的账单/账号?

时间:2011-07-31 03:15:06

标签: delphi delphi-7 delphi-xe

您的人们使用什么来生成唯一帐号? 有些人使用Autoinc字段,有些则使用其他东西...... 在运行插入查询之前获取帐号的正确方法是什么?

4 个答案:

答案 0 :(得分:8)

如果您使用的是SQL数据库,请使用Generator。如果要使用独立机制,可以考虑使用GUID。

答案 1 :(得分:4)

你还没有告诉我们你正在使用什么数据库系统,但从它的声音来看,你在谈论Delphi中的Paradox表。如果是这样,autoInc列可以工作,但是如果我没记错的话,在使用Paradox autoInc列移动数据时必须非常小心,因为它们在移动时会从零重新生成。

如前所述,您可以使用GUID - sysutils.function CreateGUID(out Guid:TGUID):HResult; - 它们将始终是唯一的,但缺点是在GUIDS中,这些键的排序不直观,可能毫无意义,因此您需要某种时间戳列来维护插入的顺序,这很重要。此外,GUID是一个相当长的字符串,并且不能非常有效地用作帐户#,它假定在许多表中都是主键或外键。

所以如果你想要一些自动的东西,我会坚持使用autoInc,但是如果你需要移动数据并且需要维护原始密钥,那么将原始autoincs作为整数列加载到新位置,否则你最终可能会腐败整个数据库。 (我相信还有其他一些场景也会导致autoIncs在Paradox表中重置 - 如果相关则研究它 - 自从我使用Pdox以来已经很长时间了,并且它可能不是其他平面文件数据库的问题)

如果您确实使用的是数据库服务器--SQLServer,Oracle,Interbase等,它们都具有autoInc / indentity或生成器功能,有时与触发器相结合 - 这是您的最佳选择。

如果你想在Delphi代码中自己处理这个问题,那么Dorin的答案也是一个很好的解决方案。创建一个全局的,线程安全的功能来实现它 - 这将确保非常高的安全性。

HTH

答案 2 :(得分:2)

根据您想要的数字长度,您可以使用Jamies MD5转换或:

var
  LDateTime: TDateTime;
  LBytes: array[0..7] of Byte absolute LDateTime;
  LAccNo: string;
  Index: Integer;
begin
  LDateTime := Now;
  LAccNo := EmptyStr;
  for Index := 0 to 7 do
    LAccNo := LAccNo + IntToHex( LBytes[ Index ], 2 );
  // now you have a code in LAccNo, use it wisely (:
end;

答案 3 :(得分:-1)

我使用此PHP代码段生成一个不错的帐号:

$account_number = str_replace(array("0","O"),"D",strtoupper(substr(md5(time()),0,7)));

这将创建一个不包含0或o的7位varchar字符串(以避免电话错误或在电子邮件中转录它们等)。您可以获得类似EDB6DA6或76337D5或DB2E624的内容。