try
    m_Query.Open;
  except
    m_Query.ExecSQL;
  end;
这段代码在遇到select语句时可以执行,在遇到其它的如insert时就会在m_Query.Open后面弹出错误提示窗口,根本就没有起到try的作用啊,高手指点,怎么作才可以谢谢

解决方案 »

  1.   

    那个错误提示是:CommandText does not return resultset!!!!
      

  2.   

    这个错误实际上已经被你捕获了,
    但是在Delphi的Ide环境下还是会先被系统抓到。
    用.exe文件执行就没有问题了。
    或者出错后继续按运行也会继续执行下去得到你的结果。
      

  3.   

    同意 Nirvanaxumm(狂背单词) ;  请按F9继承执行, 或者运行EXE可执行文件.
      

  4.   

    我照样子试过呢,不是那么回事!可能我的代码还有什么问题,我仔细的查看一下,不过我按照Nirvanaxumm(狂背单词)说的试过以后发现在执行.exe文件时会出现:“违反了PRIMARY KEY约束 'PK_Expert'。不能在对象'Expert'中插入重复键。”的错误,但是在数据库中实际的记录已经插入一部分。如过我将那就try的放在整个插入信息的最后的话,我想记录是会查入,但是在弹出错误框的地方的记录还是不会插入进去的,也就是说这个try的结构还有问题,但我在许多书上看到这个在这个部分都是这么样写的,难道都错了?(我自己认为不可能,可我还是想不通)那么如果是错了,有什么更好的办法么?
      

  5.   

    try
        m_Query.Open;
      except
        m_Query.ExecSQL;
      end;
    你的这段代码不会屏蔽插入重复键的可能,所以会出现违反约束的问题 可以试一下这样的结构
    try
        m_Query.Open;
      except
        try      
          m_Query.ExecSQL;
        except
          m_Query.cancle;(还可以加个提示)
          abort;
        end;
      end;
      

  6.   

    你这段代码写的有问题,
    你的初衷是先执行 m_Query.Open,如果出错,就认为SQL不是Select类型,是更新类型的SQL(Insert Update Delete),然后执行m_Query.ExecSQL;
    但是m_Query.Open出错有很多原因的,也许SQL语句有问题。
      

  7.   

    很明显可以看出楼主的意图,他是想用Delphi的异常机制来区别不同SQL语句类型,不过代码确实不该这样写呀,如果在ExecSQL出现问题怎么办?
      

  8.   

    在onerror事件里,把Action置为daAbort,则可以屏蔽数据库返回的错误,象你这种重复键的错误就是数据库返回的
      

  9.   

    你的try只保护了Query.Open,当是insert时,可以捕获到,进入到query.ExecSQL,但是你的insert语句如果有问题的话,例如主键重复,这时你就没有try保护了。所以会抛出异常,而你没有捕获到。
    try
        m_Query.Open;
    except
        try      
          m_Query.ExecSQL;
        except
          ... //添加处理异常的代码
        end;
    end;