小弟有这样一个问题:
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对象中插入重复键'可是在库中却有新插入的记录。

解决方案 »

  1.   

    把 if adoquery1.RecordCount>0改成 if Not adoquery1.isempty then试试
      

  2.   

    调试,看看在执行ExecSQL之前,Edit1.Text的内容到底是什么,然后到数据库中看看啊有这记录。
      

  3.   

    我发现了一处错误,就是把函数strtoint去掉,但还是不行。调试发现edit1.text的内容就是我输入的内容,一上午都这样,急死了,谢谢大哥热心啊
      

  4.   

    但是 错误 信息是这样的了:
    EDataBaseError with message ADOquery1:Commandtext don't return a result set.
    我不知道具体那里错了?
      

  5.   

    你Open了。不是用的是execsql吗?
    你的程序真是问题多多。说起来太麻烦。
      

  6.   

    你有没有把adoquery1这个数据集连到某一个DBGRID之类的控件啊。
      

  7.   

    teapot(茶壶)老兄:
     小弟初学,希望多多指教!~~我没有触发器的。
    gulf1234(小顾): 我把 adoquery1连接到dataSource上,用dataSource和DBGRID连接了,有什么不同吗?
      

  8.   

    那当然要出错拉。
    你把数据集连到了DBGRID上,但是当你执行了execsql语句后,该数据集就变的没有数据集返回啦,但是你连到DBGRID,就要求有数据集返回,那不就要报错了啊。这种情况下,一般你可以用多个ADOQUERY来处理,这样的程序看起来也会比较清晰。
      

  9.   

    大体逻辑上倒是没有什么问题,只是
    1)RecordCount一般我是不怎么用,我一般都是用Isempty来判断的,因为RecordCount有时会不准确的。
    2)对于数据集
       一般都会有两组,一组是专门来连DBGRID之类的控件,对于这种临时查询,或者临时执行某个更新的语句,我一般会用另一个(组)来执行。   至于程序的细节没有仔细看。。
      

  10.   

    gulf1234(小顾)大哥:象你所说,我该怎么处理?我把程序改成以下代码:
     不显示错误了,但是不能更新,咋办?
    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;
      

  11.   

    你现在DBGRID是不是连了另一个数据集啊?比如是ADOQUERY2
    这样的话,你在执行了 ExecSQL后,要重新打开下ADOQUERY2,新增的数据才会刷新到ADOQUERY2中啊。我不太清楚你的界面上是什么样的,具体是怎么操作的?比如是一般的数据维护呢,我建议你可以这样,直接用ADOQUERY2。
    ADOQUERY2.Insert;
    ADOQUERY2.fieldbyname('字段1').asstring:=...;
    ADOQUERY2.fieldbyname('字段2').asdatetime:=...;
    ADOQUERY2.fieldbyname('字段3').asfloat:=...;
    ADOQUERY2.post
      

  12.   

    现在DBGRID连接ADOQUERY1,另外加了个ADOquery2,可还是不行,出现了
    仍然出现错误:
    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;
      

  13.   

    你代码都写错了,你吧哪个exit注释掉了,就是有重复的值,也会继续运行下面的添加程序
      

  14.   

    对这段代码问题多多,后来看资料加上各位的帮助,已经修改成功。可是下面该怎么办?
    if Not adoquery1.isempty then
                    //如果有重复的数据
                  begin
                       showmessage('关键字经存在');
                       //这里加break???不让他继续
                  end;
      

  15.   

    加个exit 直接跳出
    你这里的关键是你如果判断是重复的数据,那么你该如何控制不让下面的插入继续执行呢?
    呵呵,好好想想,其实也很简单的,对不对!
    你可以写
    if  adoq.recordcount > 0  then
    ...//重复就执行这里代码
    else
    ...//不重复就开始插入
      

  16.   

    在程序中不要用.recordcount,这样会非常浪费资源。