小弟有这样一个问题:
procedure TFormQuery.BBaddClick(Sender: TObject);
begin if (edit1.Text<>'') and (edit2.Text<>'') then
begin
with adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select id from userinfo where id='+edit1.text+'');
Open;
if adoquery1.RecordCount>0 then
begin
if messageDlg('输入的"编号"重复,请检查!',mtWarning,[mbOk],0)=1then
begin
active:=false;
active:=true;
showmessage('关键字经存在');
//exit;
end;
end;
close;
sql.Clear;
sql.Add('insert into userinfo values(:nid,:nname,:npwd,:ndemo)');
Parameters.ParamByName('nid').Value:=strtoint(Edit1.Text);
Parameters.ParamByName('nname').Value:=trim(edit2.Text);
Parameters.ParamByName('npwd').Value:=trim(edit3.Text);
Parameters.ParamByName('ndemo').Value:=trim(memo1.Text);
try
ExecSQL;//执行操作
except
showmessage('数据库出错');
end;
open;
end;
end
else
showmessage('姓名和编号不能为空!');
exit;
end;
运行后即使插入的是不相同的记录,仍然出现错误:
raised exception class Eoleexception with message'违反了PRIMARY KEY约束,
不能在userinfo对象中插入重复键'可是在库中却有新插入的记录。
procedure TFormQuery.BBaddClick(Sender: TObject);
begin if (edit1.Text<>'') and (edit2.Text<>'') then
begin
with adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select id from userinfo where id='+edit1.text+'');
Open;
if adoquery1.RecordCount>0 then
begin
if messageDlg('输入的"编号"重复,请检查!',mtWarning,[mbOk],0)=1then
begin
active:=false;
active:=true;
showmessage('关键字经存在');
//exit;
end;
end;
close;
sql.Clear;
sql.Add('insert into userinfo values(:nid,:nname,:npwd,:ndemo)');
Parameters.ParamByName('nid').Value:=strtoint(Edit1.Text);
Parameters.ParamByName('nname').Value:=trim(edit2.Text);
Parameters.ParamByName('npwd').Value:=trim(edit3.Text);
Parameters.ParamByName('ndemo').Value:=trim(memo1.Text);
try
ExecSQL;//执行操作
except
showmessage('数据库出错');
end;
open;
end;
end
else
showmessage('姓名和编号不能为空!');
exit;
end;
运行后即使插入的是不相同的记录,仍然出现错误:
raised exception class Eoleexception with message'违反了PRIMARY KEY约束,
不能在userinfo对象中插入重复键'可是在库中却有新插入的记录。
EDataBaseError with message ADOquery1:Commandtext don't return a result set.
我不知道具体那里错了?
你的程序真是问题多多。说起来太麻烦。
小弟初学,希望多多指教!~~我没有触发器的。
gulf1234(小顾): 我把 adoquery1连接到dataSource上,用dataSource和DBGRID连接了,有什么不同吗?
你把数据集连到了DBGRID上,但是当你执行了execsql语句后,该数据集就变的没有数据集返回啦,但是你连到DBGRID,就要求有数据集返回,那不就要报错了啊。这种情况下,一般你可以用多个ADOQUERY来处理,这样的程序看起来也会比较清晰。
1)RecordCount一般我是不怎么用,我一般都是用Isempty来判断的,因为RecordCount有时会不准确的。
2)对于数据集
一般都会有两组,一组是专门来连DBGRID之类的控件,对于这种临时查询,或者临时执行某个更新的语句,我一般会用另一个(组)来执行。 至于程序的细节没有仔细看。。
不显示错误了,但是不能更新,咋办?
procedure TFormQuery.BBaddClick(Sender: TObject);
begin
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
with adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select id from userinfo where id='+edit1.text+'');
if Not adoquery1.isempty then
begin
if messageDlg('输入的"编号"重复,请检查!',mtWarning,[mbOk],0)=1then
showmessage('关键字经存在');
end;
close;
sql.Clear;
sql.Add('insert into userinfo values(:nid,:nname,:npwd,:ndemo)');
Parameters.ParamByName('nid').Value:=trim(Edit1.Text);
Parameters.ParamByName('nname').Value:=trim(edit2.Text);
Parameters.ParamByName('npwd').Value:=trim(edit3.Text);
Parameters.ParamByName('ndemo').Value:=trim(memo1.Text);
try
ExecSQL;//执行操作
except
showmessage('数据库出错');
end;
end;
end
else
showmessage('姓名和编号不能为空!');
exit;
end;
这样的话,你在执行了 ExecSQL后,要重新打开下ADOQUERY2,新增的数据才会刷新到ADOQUERY2中啊。我不太清楚你的界面上是什么样的,具体是怎么操作的?比如是一般的数据维护呢,我建议你可以这样,直接用ADOQUERY2。
ADOQUERY2.Insert;
ADOQUERY2.fieldbyname('字段1').asstring:=...;
ADOQUERY2.fieldbyname('字段2').asdatetime:=...;
ADOQUERY2.fieldbyname('字段3').asfloat:=...;
ADOQUERY2.post
仍然出现错误:
raised exception class Eoleexception with message'违反了PRIMARY KEY约束,
不能在userinfo对象中插入重复键'不知道怎么搞的
谢谢了
procedure TFormQuery.BBaddClick(Sender: TObject);
begin
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
with adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select id from userinfo where id='+edit1.text+'');
//if adoquery1.RecordCount>0 then
if Not adoquery1.isempty then
begin
if messageDlg('输入的"编号"重复,请检查!',mtWarning,[mbOk],0)=1then
showmessage('关键字经存在');
end;
ADOquery2.close;
ADOquery2.sql.Clear;
ADOquery2.sql.Add('insert into userinfo values(:nid,:nname,:npwd,:ndemo)');
ADOquery2.Parameters.ParamByName('nid').Value:=trim(Edit1.Text);
ADOquery2.Parameters.ParamByName('nname').Value:=trim(edit2.Text);
ADOquery2.Parameters.ParamByName('npwd').Value:=trim(edit3.Text);
ADOquery2.Parameters.ParamByName('ndemo').Value:=trim(memo1.Text);
try
ADOquery2.ExecSQL;//执行操作
except
showmessage('数据库出错');
end;
ADOquery2.open;
end;
end
else
showmessage('姓名和编号不能为空!');
exit;
end;
if Not adoquery1.isempty then
//如果有重复的数据
begin
showmessage('关键字经存在');
//这里加break???不让他继续
end;
你这里的关键是你如果判断是重复的数据,那么你该如何控制不让下面的插入继续执行呢?
呵呵,好好想想,其实也很简单的,对不对!
你可以写
if adoq.recordcount > 0 then
...//重复就执行这里代码
else
...//不重复就开始插入