求教dBase表中维护主关键字的方法(50分)

  • 主题发起人 主题发起人 yysun
  • 开始时间 开始时间
Y

yysun

Unregistered / Unconfirmed
GUEST, unregistred user!
主关键字不能为空,不能重复,用dBase数据库时,需要自己编程解决。
我现在只好,放上两个TTable,一个作编辑用,在onBeforePost事件中,
查另一个表,总觉得别扭,故求教更好的办法。
 
建议用edit进行录入,而后自己写sql进行插入,
这样就可以在插入前查本表的主键值.
我从来不喜欢用dbedit之类,大概跟个人习惯有关吧!
 
不想用表?用文本文件!!哈!!!
如果你有兴趣搜索整个表(开玩笑?!)
如果天气好可以使用INI或者REGISTRY(天气真的太好了!!)!
 
天气好的时候是可以多聊一聊,我从来就管TEdit叫做edit,
以区别于dbedit,不知道yysun是不是也会产生同样的误解,
认为我是让你用notepad去写sql语句?。

一条Select语句就可以查到是否存在与当前要插入数据
的主键重复的记录,可能别人习惯于管这个叫"检索",
可我总是称之为搜索。

谢谢关心,我以后得多注意用词的标准性了 :-)
 
dwwang大侠高见!
昨天晚上睡不着,想了半夜,觉得在维护简单的表中维护主关键字不是太难!
只要每次加入记录时,按主关键字排序,查找最后记录的值,并+1即可
当然,数据库建立起必须始终使用这个方法,具体如下

在BEFOREINSERT中输入以下代码:
Var
TmpIndex:String;
begin
TmpIndex := Table1.IndexName;
Table1.IndexName := 'ByKey';
TmpKey := Table.FieldByName('key').Value + 1;
Table1.IndexName := TmpIndex;
end;
其中TMPKEY为全局变量,在BEFOREPOST中把它给TABLE的KEY就可以,当然KEY为关键
字.在KEY上有一个索引.我觉得这样也许可以!
不知dwwang大虾有何高见??


 
恕我直言,CJ兄大概不从事数据库的研究与编程,
所谓主关键字,既不必是一个字段,也不一定是
何种类型,因此老兄的理解大概有误。
 
我不理解dwwang大侠的意思?
我认为(也许的确有误)主关键字的作用就是在表中是唯一的,至于何种类型
并不重要,我以经在KEY上索引,每次按KEY排序,然后找到最后记录,取其值,然后
+1 那一定是唯一的!我也是用这个方法维护自己的数据库的。
我的程序可能少了些什么,现在补上:
在AFTERINSERT中使用以下代码:
Table1.FieldByName('KEY').Value := tmpKey;
tmpKey为全局变量LONTINT型(我想表的主关键字没有规定一定不能是什么型,当然
天气好也可以用STRING什么的)。
我觉得这样的索引也可以起到主关键字的作用!
也许本人从事程序设计时间不长,希望dwwang大侠可以免费指教,谢谢!!
 
补充:
以上程序如果数据库经常需要删除的话,可能主关键字超过LONGINT的范围,
需要定期整理,可以使用类似的代码:
Var
i:longint;
begin
for i:=0 to Table1.RecordCount - 1 do
begin
Table1.FieldByName('KEY') := i;
end;
end;

昨天又想了一下,如果在多拥护环境下,可能有问题!
我认为可以用时间的方法建立数据库关键字:

在TABLE的BEFOREPOST中输入以下代码:

if Table1.States = dsInsert Then //如果为插入记录
begin
Table1.FieldByName('KEY').AsString := FormatDateTime
('yyyymmddhhmmss',now);//把主主关键字设置为当前的日期+时间。KEY为STRING类型
end;

这样只要多个用户不是在同一秒内进行POST,就可以维护主关键字的唯一性。
不止诸位意下如何?
 
感谢CJ兄的解答,确实是可行的.

但我想可能CJ兄的解答和yysun的原意并不一致.

CJ兄所解决的其实是AutoIncrease Field,这只是主键的一种情况.
我想,yysun并不是说,无法确认主键是什么.在大多数情况下,并不是缺少主键,
主键在数据库设计时早已确定.

所以说,如果不更改主键设置,在BeforeInsert前进行SQL检查可能是
唯一的方法.

 
我推荐使用AutoIncrease的主键.就算主键可以确定!
如果要解决的不是AutoIncrease问题而是维护某一字段的唯一性,曹兄的方法的确
不错.但是我觉得(我是这样做的)应该在BEFOREPOST中加入检查语句.
 
有些问题不是 AutoIncrease 字段可以解决的。
例如,一个表记录用户信息,以用户名作为主键,因为用户名不能重复 ...

各位数据库专家:
有比在onBeforePost事件中查另外一个TTable,或者
"用edit进行录入,而后自己写sql进行插入 ..." (from dwwang)
更好的办法吗?
 
一定没有!
如果用TEDIT输入,然后用SQL插入如何能保证不会有重复出现?(本人SQL水平一般)
对于主键我的做法是:
1 尽量用AutoIncrease
2 如果有类似编号之类的,则尽量自动生成
3 如果用户自己输入的主键,那么只能在TTABLE的BEFOREPOST中输入相应的查询
不过我认为尽量用数据库自己带的检查机制,现在数据库转换已经不是太大的问题,
小型数据库尽量用PARADOX/ACCESS之类,大型数据库一般都有.
如果用的是DBASE等数据库,那么现在数据库转换已经不是太大的问题,用DELPHI写
个转换程序,可以保证数据库的完整性

才50分,写了那么多,好累!
 
一定没有!
如果用TEDIT输入,然后用SQL插入如何能保证不会有重复出现?(本人SQL水平一般)
对于主键我的做法是:
1 尽量用AutoIncrease
2 如果有类似编号之类的,则尽量自动生成
3 如果用户自己输入的主键,那么只能在TTABLE的BEFOREPOST中输入相应的查询
不过我认为尽量用数据库自己带的检查机制,现在数据库转换已经不是太大的问题,
小型数据库尽量用PARADOX/ACCESS之类,大型数据库一般都有.
如果用的是DBASE等数据库,那么现在数据库转换已经不是太大的问题,用DELPHI写
个转换程序,可以保证数据库的完整性

才50分,写了那么多,好累!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部