请教数据库的基础问题。(100分)

  • 主题发起人 主题发起人 阿虫
  • 开始时间 开始时间

阿虫

Unregistered / Unconfirmed
GUEST, unregistred user!
我对数据进行保存,其中姓名是数据库中的键。
当姓名输重复时,数据将无法保存。我的语句如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
BEGIN
TABLE1.ACTIVE:=TRUE;
table1.append;
table1.fieldbyname('姓名').asstring:=edit1.text;

table1.post;
TABLE1.ACTIVE:=FALSE;
END;
为了输重了也能保存,我将姓名的键去掉,可那样一保存会出现一个同姓名的人在下面.
如何可以实现当出现重复姓名时,出现一个询问窗口,询问是不是要覆盖,是的话保存,不是的话
退出.我的数据库是PARADOX;希望写出代码。

还有一个很菜的问题,我的窗口在程序打开是,莫明其妙的变的很大,我改了窗口的WIDTH和
HEIGHT ,竟然不起作用,咋调才行呢。
 
还是要用唯一主键,拦截它的Error,如果是带重名特征的,就出提示对话框。
 
在table1 beforepost事件中 locate判断是否存在同名
 
改用TQuery部件
procedure TForm1.BitBtn1Click(Sender: TObject);
BEGIN
qry_SaveData.Sql.Clear;
qry_SaveData.Sql.Add('select * from 你的表名 where 姓名=:Key_0');
qry_SaveData.RequestLive := True;
qry_SaveData.Params[0].AsString := Edit1.Text;
qry_SaveData.ACTIVE:=TRUE;
if qry_SaveData.RecordCounr=0 then
qry_SaveData.Append
else begin
if Application.MessageBox(PChar('已经有同名用户,覆盖吗?'),'提示', MB_YESNO + MB_ICONQUESTION) = IDYes then
qry_SaveData.Edit;
end;
if qry_SaveData.State in [dsEdit, dsInsert] then
begin
... ...//这里输入其它的字段内容
qry_SaveData.Post;
end;
END
 
procedure TForm1.BitBtn1Click(Sender: TObject);
BEGIN
TABLE1.ACTIVE:=TRUE;
if table1.locate('姓名',edit1.text,[loPartialKey])=false then
begin
table1.append;
table1.fieldbyname('姓名').asstring:=edit1.text;

table1.post;
TABLE1.ACTIVE:=FALSE;
end
else
begin
if application.messagebox('重名,是否覆盖?','error',mb_yesno)=id_yes then
begin
//
end
else
begin
//
end;
end;

END;
 
用Locate函数
 
根本问题是,你不能用人名来作为主键,表结构改为
NO 代号(主键)
NAME 姓名
要养成好习惯
 
一般不用汉字来做索引,应该定义内部的自增的唯一索引,就像weiweiHu说得那样。
 
谢谢大家了,LIUCHANG-WH的答案正是我想要我,谢谢啦。对SZF 的方法我认为也很好,回头
我要试试。再次谢谢大家了。
 
后退
顶部