可以的,不过我发现你的代码有问题。如果你的代码是直接从DELPHI中拷下来的话
Query1.SQL.Add('where"'+Tkind+twriter+Tcbs+Tname);中的双引号有问题。另,where是不是与后面的语句没有分割符,看不出来。建议SHOW一下SQL。一定是SQL中有问题。
Query1.SQL.Add('where"'+Tkind+twriter+Tcbs+Tname);中的双引号有问题。另,where是不是与后面的语句没有分割符,看不出来。建议SHOW一下SQL。一定是SQL中有问题。
题示出错
但条件时
invalid filed name
多条件时
invalid use keyword
中的e3外面是不是该加个引号。
即 Tname:='and mainbook.name='+'''e3'''二、诸如name,kind之类的是不是关键词,你能不能查一下,我记不得了。仅供参考。
查一查吧
当ZE=村上春树时
sql.savetofile为
Select *
From mainbook.DB
Where mainbook.ZE="村上春树"
delphi提示invalid filed name
procedure TForm5.Button1Click(Sender: TObject);
Var
Tkind,Tcbs,Tname,Twriter,e1,e2,e3,e4:string;
i,j,k:integer;
temp:boolean;
begin
e1:=edit1.text;
e2:=edit2.text;
e3:=edit3.Text;
e4:=edit4.text;
temp:=false;
if(e1<>'')then
begin
if(temp=false)then
Tkind:=' mainbook.kind='+e1;//加一个空格
temp:=true;
end
else Tkind:=' ';//加一个空格
if(e2<>'')then
begin
if(temp=false)then
Twriter:=' mainbook.ze='+e2//加一个空格
else
Twriter:=' and mainbook.ze='+e2;//加一个空格
temp:=true;
end
else Twriter:=' ';
if(e3<>'')then
begin
if(temp=false)then
Tname:=' mainbook.name='+e3//加一个空格
else
Tname:=' and mainbook.name='+e3;//加一个空格
temp:=true;
end
else Tname:=' ';if(e4<>'')then
begin
if(temp=false)then
Tcbs:=' mainbook.cbs='+e4//加一个空格
else
Tcbs:=' and mainbook.cbs='+e4;////加一个空格和and后也加一个空格
temp:=true;
end
else Tcbs:=' ';
Query1.close;
Query1.SQL.clear;
Query1.SQL.Add('Select * ');//加一个空格
Query1.SQL.Add('From mainbook.db ');//加一个空格
Query1.SQL.Add(' where '+Tkind+twriter+Tcbs+Tname);//分别在where前后加一个空格 去掉双引号.
一定是它写错了
调程序得有方法
问题
完全不用等号,直接if temp then 就可以了在query部件的sql属性里单独调试你的sql语句,先调试通过了再改你的程序!
我觉得调试程序,必须按照步骤来,否则将是一锅粥。
但我要告诉你
问题肯定处在sql语句错误上
调程序的方法有很多种
你可以在执行sql语句前先show出来看看到底语句对不对
showmessage(query1.text);
procedure TForm5.Button1Click(Sender: TObject);
Var
Tkind,Tcbs,Tname,Twriter,e1,e2,e3,e4:string;
i,j,k:integer;
temp:boolean;
begin
e1:=edit1.text;
e2:=edit2.text;
e3:=edit3.Text;
e4:=edit4.text;
temp:=false;
if(e1<>'')then
begin
if(temp=false)then
Tkind:=' and mainbook.kind="'+e1 + '"' ;//加一个空格and " "
temp:=true;
end
else Tkind:=' ';//加一个空格
if(e2<>'')then
begin
if(temp=false)then
Twriter:=' and mainbook.ze="'+e2 + '"' //加一个空格 and " "
else
Twriter:=' and mainbook.ze="'+e2 +'"';//加一个空格 " "
temp:=true;
end
else Twriter:=' ';
if(e3<>'')then
begin
if(temp=false)then
Tname:=' and mainbook.name="'+e3 +'"'//加一个空格 and " "
else
Tname:=' and mainbook.name="'+e3+'"';//加一个空格 " "
temp:=true;
end
else Tname:=' ';if(e4<>'')then
begin
if(temp=false)then
Tcbs:=' and mainbook.cbs="'+e4+'"'//加一个空格 and " "
else
Tcbs:=' and mainbook.cbs="'+e4+'"';////加一个空格和and后也加一个空格
temp:=true;
end
else Tcbs:=' ';
Query1.close;
Query1.SQL.clear;
Query1.SQL.Add('Select * ');//加一个空格
Query1.SQL.Add('From mainbook.db ');//加一个空格Query1.SQL.Add('where 1=1') ;//加这一行。***************************Query1.SQL.Add(Tkind+twriter+Tcbs+Tname);//这样写
Query1.Open ; 总之呢,DB中的字符型值要加双引号或单引号的,两sql string连接时要加空格分隔。
当然啦,好的程序风格及逻辑就更重要了,象你这个程序,到我手里,我会叫你重做的,hehe..。
如还有什么问题,可以与我联系,我天天做这个的。
procedure TForm5.Button1Click(Sender: TObject);
Var
Tkind,Tcbs,Tname,Twriter,e1,e2,e3,e4:string;
i,j,k:integer;
temp:boolean;
begin
e1:=edit1.text;
e2:=edit2.text;
e3:=edit3.Text;
e4:=edit4.text;
temp:=false;
if(e1<>'')then
begin
if(temp=false)then
Tkind:=' mainbook.kind='+e1;
temp:=true;
end
else Tkind:=' ';
if(e2<>'')then
begin
if(temp=false)then
Twriter:=' mainbook.ze='+e2;
else
Twriter:=' and mainbook.ze='+e2;
temp:=true;
end
else Twriter:=' ';
if(e3<>'')then
begin
if(temp=false)then
Tname:=' mainbook.name='+e3;
else
Tname:=' and mainbook.name='+e3;
temp:=true;
end
else Tname:=' ';if(e4<>'')then
begin
if(temp=false)then
Tcbs:=' mainbook.cbs='+e4;
else
Tcbs:=' and mainbook.cbs='+e4;
temp:=true;
end
else Tcbs:=' ';
Query1.close;
Query1.SQL.clear;
Query1.SQL.Add('Select * ');
Query1.SQL.Add('From mainbook.db ');
Query1.SQL.Add(' where '+Tkind+twriter+Tcbs+Tname);
query1.open;其中有几处加了空格,如果在SQL中该有的分隔符的地方没有空格,那么则在执行的时候就会当成一个关键字,如果不是关键字,则会做为变量,会出现错误,“Too few pre……”等等提示信息,不知可否正确,若该程序不行,则可以将你的SQL show出来看看,或者Sql.savetofile('sql.txt');
来将SQL存入文件sql.Txt中,最后将其剪下来到其Database explorer中去运行,得到更多信息,直到其正确为止,就能找出问题所在了。
记着,空格一定不能省的,能多不能省!
注意这个问题:
if(e1<>'')then
begin
>> if(temp=false)then if (temp=false) then
>> Tkind:='mainbook.kind='+e1; begin
tkind:='mainbook.kind='+e1;
>> temp:=true; temp:=true;
end end;
else Tkind:='';
if(e2<>'')then
begin
>> if(temp=false)then if (temp=false) then
>> Twriter:='mainbook.ze='+e2 Twriter:='mainbook.ze='+e2
>> else else
begin
>> Twriter:='and mainbook.ze='+e2; Twriter:='and ainbook.ze='+e2;
temp:=true;
end;
>> temp:=true;
end
else Twriter:='';
procedure TForm5.Button1Click(Sender: TObject);
Var
Tkind,Tcbs,Tname,Twriter,e1,n1,n2,n3,n4,e2,e3,e4,N:string;
i,j,k:integer;
temp:boolean;
begin
Query1.close;
e1:=edit1.text;
e2:=edit2.text;
e3:=edit3.Text;
e4:=edit4.text;
temp:=false;
if(e1<>'')then
begin
if(temp=false)then
Tkind:=' KIND='+#39+e1+#39;
temp:=true;
end
else Tkind:='';
if(e2<>'')then
begin
if(temp=false)then
Twriter:=' ZE='+#39+edit2.text+#39
else
Twriter:=' And ZE='+#39+e2+#39;
temp:=true;
end
else Twriter:='';
if(e3<>'')then
begin
if(temp=false)then
Tname:=' NAME='+#39+e3+#39
else
Tname:=' and NAME='+#39+e3+#39;
temp:=true;
end
else Tname:='';if(e4<>'')then
begin
if(temp=false)then
Tcbs:=' cbs='+#39+e4+#39
else
Tcbs:=' and cbs='+#39+e4+#39;
temp:=true;
end
else Tcbs:='';
Query1.close;
Query1.SQL.clear;
Query1.SQL.Add('Select * ');
Query1.SQL.Add('From mainbook.DB ');
Query1.SQL.Add(' Where '+Tkind+Twriter+Tcbs+Tname);
//Query1.sql.savetofile('c:\1.txt') ;Query1.open;end;
问什么不能用表名.域名 eg:mainbook.ze
而只能用域名 eg:ze
我只是路过这里,觉得无聊,近来瞎扯的,有什么贻笑大方的地方,请别见怪呀!
Good luck。