我现在用ADO组件对数据库做操作我没有用数据感知控件 而是用ADOQuery里面的SQl.Add('insert into table1 (c1,c2) values('aaa','bbb')');我现在怕出错误 想用 try ...except...finnely 来捕获和处理错误但是没有效果啊!
难道说必须要用ADOQuery里的方法吗?

解决方案 »

  1.   

    tryexcept
      on E:exception do
      application.MessageBox(pchar(E.Message),'Info',mb_ok+mb_iconinformation);
    end;
      

  2.   

    try
      ...
    except
      on Exception....
      ...
    end;
    在delphi中运行会显示所有异常,而实际运行就不会了
      

  3.   

    楼上的啥意思捏!我其实就是主要想捕获错误然后提示用户让他们 重新输入 但是我试了用这个来捕获 没有反应啊!是说必须得用ADOQuery里的方法来对数据库操作吗?自己写SQL语句就捕获不到了?
      

  4.   

    用ADOQuery.execsql来执行sql语句时,ADO驱动程序不对其进行数据检查,只有提交到数据后,数据库才会报告错误出来,依你的意思,应该是要在sql语句提交给数据库前就要进行数据检查。以便让用户再重新输入数据。如果是这样的话,可先对提交前的数据作自行检查,再提交数据到数据库。或者在onposterror里铺获错误,再让用户更正。
      

  5.   

    在beforepost里面判断,
    if xxxx then
    begin
      //.........
      abort;
    end;  
    if xxxx then 
    begin
        //.....
        abort;
    end;  
      

  6.   

    或者
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    try
      with ADOQuery1 do
      begin
        //Close;
        //Execsql;
      end;
    except
      on EOleException do
      begin
        ShowMessage('Error');
      end;
    end;
      

  7.   

    try
        
      except
        on E:EOleException do
         begin
           Application.ShowException(E);
           Exit;
         end;
      end;
      

  8.   

    qzxyd(只会种菜) 是说只能在提交前把所有会出现的问题都想到吗?难道就没有别的办法吗?我试过try except 没用啊 一会再用楼上几位高人的方法去试下
      

  9.   

    Bellamy(酷公爵) 我按照你的方法试过了啊 还是不成啊!还是走不到  except 里面啊!显示的还是数据库的报错信息!怎么办呢?
      

  10.   

    各位说的都没什么问题啊,用try....except(finally)是可以的啊,不知道楼主为什么说不行。不过在单步跟踪执行的时候,是会把原始错误信息弹出来的。全速执行就不会了。还有一个问题,你写的那条SQL肯定是不能执行的,有语法错误,要改成如下形式:
    SQl.Add('insert into table1 (c1,c2) values(''aaa'',''bbb'')');
      

  11.   

    用 try ...except...可以的
    也可以创建一个E:EOleException 异常类
      

  12.   

    ppiy3670() ( ) 谢谢你!是可以捕捉到 我的意思是想在except里执行我自己的处理 !比如用MessageDLG显示我自己定义的出错信息!比如把不该加的数据再删除等等!但是现在就是固定的一个出错的弹出对话框不执行我自己的处理语句
      

  13.   

    raise exception.create('你要说明的错误');
      

  14.   

    try
    except
    end;---------------------------------------              欢迎访问 http://www.coderpub.com 技术论坛
      

  15.   

    照下面这样写,就不会弹出原始的错误信息来了:
    ADOQuery1.SQl.Text := 'insert into table1 (c1,c2) values(''aaa'',''bbb'')');
    try
      ADOQuery1.ExecSQL;
    except
      ShowMessage('妈的!怎么出错了!');
    end;
      

  16.   

    不好意思,上边的赋值语句多了一个“)”,应该是:
    ADOQuery1.SQL.Text := 'insert into table1 (c1,c2) values(''aaa'',''bbb'')';
      

  17.   

    截获系统异常,或ADOQUERY里的OnDeleteError、OnEditError、OnPostError
      

  18.   

    ppiy3670() 我试了 不成啊!
            ADOQueryRole_Pur.Close;
            ADOQueryRole_Pur.SQL.Clear;
            
            ADOQueryRole_Pur.SQL.Text := 'insert into T_ROLE_PRIVILEGE(ROLE_ID,PRIV_ID) values('''+RoleID+''','''+PurID+''')';
          try
            self.ADOQueryRole_Pur.ExecSQL;
          except
            ShowMessage('出错了!');
          end;总是弹出数据库自己的 的出错信息!就是不执行我自己的
      

  19.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    try
      with ADOQuery1 do
      begin
        //Close;
        //Execsql;
      end;
    except
      on EOleException do
      begin
        ShowMessage('Error');
      end;
    end;
      

  20.   

    不可能的!你是不是在调试代码的时候遇到这个问题?你把你的程序编译成EXE文件,然后退出Delphi,找到这个EXE文件,双击它运行,绝对不会出现你说的问题!
      

  21.   

    楼上的 这个我也试了 还是没有用啊!谁有现成的例子放出一个来啊!我都试了好多了!根本就还是显示Oracle自己的报错信息! 我想显示我自己的!
      

  22.   

    以下代码在Delphi6.0 / Oracle8.1.7 / Win2000 Professional下测试通过,没有你所说的问题:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if ADOConnection1.Connected then
        ADOConnection1.Connected := False;
      ADOConnection1.ConnectionString := 'Provider=MSDAORA.1;Password=manager;User ID'
                  +'=system;Data Source=Server;Persist Security Info=True';
      ADOConnection1.Connected := True;
      with ADOQuery1 do
      begin
        SQL.Text := 'select TABLE_NAME from user_tables where '
                  + 'TABLE_NAME = ''ABC''';
        open;
        if Fields[0].AsString = '' then
        begin
          Close;
          SQL.Text := 'Create table ABC (f1 varchar2(10),'
                                       +'f2 varchar2(10),'
                                       +'primary key(f1))';
          ExecSQL;
        end;
      end;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      with ADOQuery1 do
      begin
        if Active then Close;
        SQL.Text := 'insert into abc values (''111'', ''222'')';
        try
          ExecSQL;
        except
          ShowMessage('没插进去!');
        end;
      end;
    end;