Delphi如何判断sql语句是查询语句还是执行语句

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

9 个解决方案

#1



try
  Open;
except
  ExecSQL;
end;

#2


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

#3


语句是你自己写的,怎么会不知道,如果是要封装进来的话可以带一个标记进来啊,代表是哪种类型

#4


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

#5


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

#6


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

#7


引用 1 楼 hsmserver 的回复:

try
  Open;
except
  ExecSQL;
end;

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

#8


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

#9


我很想知道 楼主是基于什么情况下才会问这样的问题? 

#1



try
  Open;
except
  ExecSQL;
end;

#2


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

#3


语句是你自己写的,怎么会不知道,如果是要封装进来的话可以带一个标记进来啊,代表是哪种类型

#4


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

#5


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

#6


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

#7


引用 1 楼 hsmserver 的回复:

try
  Open;
except
  ExecSQL;
end;

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

#8


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

#9


我很想知道 楼主是基于什么情况下才会问这样的问题?