在Query中SQL语句不能执行。(70分)

  • 主题发起人 主题发起人 ckylixj
  • 开始时间 开始时间
C

ckylixj

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,我遇到一个奇怪的问题。有以下代码。
DataModule2.Query1.Active :=false;
DataModule2.Query1.SQL.Clear ;
s:='delete from :table';
DataModule2.Query1.SQL.Add(s);

if FlatCheckBox1.Checked then
begin
DataModule2.Query1.Active :=false;
DataModule2.Query1.ParamByName('table').AsString:='xiecha';
DataModule2.Query1.Active :=True;
DataModule2.Query1.ExecSQL ;
end;

if FlatCheckBox2.Checked then
begin
DataModule2.Query1.Active :=false;
DataModule2.Query1.ParamByName('table').AsString:='dkl';
DataModule2.Query1.Active :=True;
DataModule2.Query1.ExecSQL ;
end;


每次运行均报错,错误提示如下:
Project roject1.exe raised exception class EDBEngineError with
message 'Invalid use of keyword.
Token: from
Line Number: 1'.Process stopped. Use Step or Run to continue.

望各位大侠对在下指点一二。
 
s:='delete from :table WHERE ......';
 
把这句删掉就可以了
DataModule2.Query1.Active :=True;
 
删除的对象是谁
 
同意上面意见,可能是那的错误,去试试。
 
DataModule2.Query1.Active :=True;
这句相当于DataModule2.Query1.open;
而open只能运行select的sql语句,所以会出错
 
在改变QUERY的SQL时一般用CLOSE关闭后给SLQ.ADD(),然后根据加入的语句使用OPEN或EXECSQL
来打开数据集而不用ACTIVE属性.
 
s:='delete from :table';传入表名,不可行吧。
如果要用表应该用字符连接处理应该可以。
 
各位高手,不行呀,你们讲的我都试了。每次都是执行到
DataModule2.Query1.ExecSQL ; 报错。

 
from 前面是什么空格,是汉字空格还是英文空格呀
 
还有,最好删了那条
DataModule2.Query1.Active :=True;
用ExecSql这样不会返回数据
而OPEN 会返回数据
 
几位高手没把题目看完,哈哈!
报错的意思是关健词 from 出错!
所以问题首先出在sql语句上,可能是少掉了空格。当然,象jsxjd的这种写法如果不出错,
那就是delphi错了!(出错的提示是一样的)
然后才是 active := true 和 execsql 的用法错误!但这样用是不会报错的,只是得不到结果。
execsql:用于update, insert 等操作,对数据库进行操作,但不反回数据集。
active := true(多用于table) 或 open :用于select 等操作,只是反回数据集。
 
改用以下语句:
DataModule2.Query1.Active :=false;
DataModule2.Query1.SQL.Clear ;
if FlatCheckBox1.Checked then begin
DataModule2.Query1.SQL.Add('delete from xiecha')
else if FlatCheckBox2.Checked then
DataModule2.Query1.SQL.Add('delete from dkl');
DataModule2.Query1.execSQL;

 
楼主的SQL写法错误在于把表名当成参数动态的传递了。
而表名是不能做参数处理的,所以会出现 “from”的某些错误提示。
 
if FlatCheckBox1.Checked then
begin
DataModule2.Query1.Active :=false;
DataModule2.Query1.ParamByName('table').AsString:='XIECHA';//把表名用大写
// DataModule2.Query1.Active :=True; //去掉这一句
DataModule2.Query1.ExecSQL ;
end;
 
楼上老大,你用的什么库,表名大写就可以当参数了吗?奇怪。
 
如果表名有能用参数的可以这样
DataModule2.Query1.Active :=false;
DataModule2.Query1.SQL.Clear ;
s:='delete from';
if FlatCheckBox1.Checked then
begin
DataModule2.Query1.Active :=false;
DataModule2.Query1.Clear;
s:=s+' xiecha';
DataModule2.Query1.SQL.Add(s);
DataModule2.Query1.ExecSQL ;
end;

if FlatCheckBox2.Checked then
begin
DataModule2.Query1.Active :=false;
DataModule2.Query1.Clear;
s:=s+' dk1';
DataModule2.Query1.SQL.Add(s);
DataModule2.Query1.ExecSQL ;
end;
 
多人接受答案了。
 
后退
顶部