Delphi中对于sql查询语句调用的是ADOQuery1.Open使生效,而对于非查询语句(没有返回结果集)是调用ADOQuery1.ExecSQL,使生效的,请问如何判断一个sql语句是查询语句还是非查询语句,尝试利用pos函数查找关键字select,但是这种方法不适用于带有子查询的非查询语句,请问有没方法解决这一问题?

解决方案 »

  1.   


    try
      Open;
    except
      ExecSQL;
    end;
      

  2.   

    应该在设计上规避这个问题吧。比如使用两个ADOQuery,一个专用于查询,一个专用于更新,在编码时视业务逻辑分别在不同ADOQuery上执行。
      

  3.   

    1、简单点的话就判断select开头还是别的吧
    2、正则表达式判断关键结构,如“select ... from”、“update .... from”等
    3、设计上回避,如果你的不是通用框架,调用方应该知道调用哪个方法
      

  4.   

    拆分你的sql
    取第一个空格前的单元内容看是select还是delete还是update不久的了
      

  5.   

    我的所有update/delete语言都是查询语句
    因为最后会自动加上一行:
    select @@rowcount as fret
      

  6.   

    这个可行,但是新问题是他会执行两次sql语句
      

  7.   

    那就分3次查找:"insert","delete","update"