我正在用ado+access做一个关于图书的小系统。我想在新增图书的时候,调用insert方法后,自动生成新图书的唯一性代码?请问怎么实现???如果要是人工生成的化,太麻烦了,图书多了的话,用户也不知道哪个ID是可用的,哪个是已经用的了。
我试着用了ACCESS的自动编码类型的字段但实在是太烂了,而且在INSERT时,该字段对应的DBEdit是不可见的(而且不能编辑),最好不用自动编码类型的字段。而用文本型的(00000001~~99999999),求助一个较好的自动生成图书ID代码的方法(算法)。
我试着用了ACCESS的自动编码类型的字段但实在是太烂了,而且在INSERT时,该字段对应的DBEdit是不可见的(而且不能编辑),最好不用自动编码类型的字段。而用文本型的(00000001~~99999999),求助一个较好的自动生成图书ID代码的方法(算法)。
解决方案 »
- delphi 显示EXCELL文件
- fastreport为何不能帮定ADO数据集????
- 请问字符宽度与窗体宽度之间的换算关系?即Length('myString')与From1.Width两种不同计量之间的换算??
- 像资源管理器那样,可以拖动中间分隔栏,调整大小,怎么做?
- 应聘软件开发或程序员时应该重点注意哪方面?请各位兄弟提出宝贵意见!!
- 有关memo的三个简单问题
- 关于安装程序的制作的问题!
- 请高手帮忙-----关于对SQL表中记录条数的计算
- 请问,该如何扩展datetimepicker?
- 这句SQL 怎么写? (SQL SERVER)
- 请问如何修改系统鼠标指针呢?我现在有一个ico图标文件,想修改成系统鼠标指针,如何做?
- 非常简单,只是我不能确定。
var
id:tguid;
begin
if CoCreateGuid(id)=s_ok then
result:=guidtostring(id);
end;
-----------------------------------------------------------对的
如果是并发的可以用存储过程来控制生成
过程实现的:计算最大id,更新表id=id+1,返回最大id+1给客户端程序
ADesFieldName:String;AFieldLen:integer):String;
var
lMax,I:Integer;
lID,lDef:String;
myQuery:TAdoQuery;
begin
lDef:= '000000000000000';
SetLength(lDef,AFieldLen-1);
myQuery:=TAdoQuery.Create(nil);
try
//---- ×Ô¶¯¼ÓÈë±àºÅ
with myQuery do
begin
SQL.Clear;
if ACondition<>'' then
SQL.Add('Select Distinct '+AFieldName+' from '+TableName+' where '+ACondition+' Order By '+ADesFieldName+' Desc')
else
SQL.Add('Select Distinct '+AFieldName+' from '+TableName+' Order By '+ADesFieldName+' Desc');
Open;
if ADesFieldName='' then ADesFieldName:=AFieldName;
if not eof then
begin
lMax:=StrToInt('0'+FieldByName(ADesFieldName).AsString);
if RecordCount=lMax then
lID:= Copy(lDef+IntToStr(RecordCount+1),Length(lDef+IntToStr(RecordCount+1))-(AFieldLen-1),AFieldLen)
else
begin
for I:=RecordCount downto 0 Do
begin
lMax:=StrToInt('0'+FieldByName(ADesFieldName).AsString);
if I=lMax then begin
lID:= Copy(lDef+IntToStr(I+1),Length(lDef+IntToStr(I+1))-(AFieldLen-1),AFieldLen);
Break;
end
else
Next;
if I=0 then lID:=lDef+'1';
end;
end;
end else
lID:=lDef+'1';
Close;
end;
Result:= lID;
finally
myQuery.Free;
end;
end;
time
no++
...
所得结果加一
插入时用它做ID
good luck
-----------------------------------------------------------对的
如果是并发的可以用存储过程来控制生成
过程实现的:计算最大id,更新表id=id+1,返回最大id+1给客户端程序
----完全同意
GUID太长了,自增字段问题多多。用时间既不安全,也有些长,影响效率。
-----------------------------------------------------------对的
如果是并发的可以用存储过程来控制生成
过程实现的:计算最大id,更新表id=id+1,返回最大id+1给客户端程序
----这不正是自增字段为我们做的吗?我不明白自增字段有什么问题,我觉得非常好用。只有一种情况,就是你有多个不连网的客户端,为了保证他们的数据ID也不重复,这时候才不能用。
其实什么DBedit,DBGrid之类的,会给你的开发带来很大的限制,想要方便,就必须放弃一定的自由度,有得必有失。
var
j,k: Integer;
begin
ADOTable1.Sort:='ID ASC';
ADOTable1.First;
j:=ADOTable1['ID'];
ADOTable1.Next;
k:=ADOTable1['ID']; while (k-j=1) do
begin
j:=k;
ADOTable1.Next;
k:=ADOTable1['ID'];
end; Edit1.Text:=Inttostr(j+1);