可以的,不过我发现你的代码有问题。如果你的代码是直接从DELPHI中拷下来的话
Query1.SQL.Add('where"'+Tkind+twriter+Tcbs+Tname);中的双引号有问题。另,where是不是与后面的语句没有分割符,看不出来。建议SHOW一下SQL。一定是SQL中有问题。

解决方案 »

  1.   

    去掉" 也没用
    题示出错
    但条件时
    invalid filed name
    多条件时
    invalid use keyword
      

  2.   

    从几个方面考虑:一、        Tname:='and mainbook.name='+e3
    中的e3外面是不是该加个引号。
    即        Tname:='and mainbook.name='+'''e3'''二、诸如name,kind之类的是不是关键词,你能不能查一下,我记不得了。仅供参考。
      

  3.   

    可能是引号的问题吧,oracle中引号是不能嵌套的。需要时可用#39
      

  4.   

    sql.savetofile('c:\temp.txt');
    查一查吧
      

  5.   

    加'''或'"' 都没用
    当ZE=村上春树时
    sql.savetofile为
    Select *
    From mainbook.DB
    Where mainbook.ZE="村上春树"
    delphi提示invalid filed name
      

  6.   

    我觉得是这样的
    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前后加一个空格 去掉双引号.
      

  7.   

    将你的sql语句show出来看看
    一定是它写错了
    调程序得有方法
      

  8.   

    你在SQL Explorer里把你的SQL Run一下(加上条件),看看是不是Sql的问题,我感觉是sql的
    问题
      

  9.   

    if(temp=false)then  ...
    完全不用等号,直接if temp then 就可以了在query部件的sql属性里单独调试你的sql语句,先调试通过了再改你的程序!
    我觉得调试程序,必须按照步骤来,否则将是一锅粥。
              
      

  10.   

    我没有看你那么长的代码,很浪费时间
    但我要告诉你
    问题肯定处在sql语句错误上
    调程序的方法有很多种
    你可以在执行sql语句前先show出来看看到底语句对不对
    showmessage(query1.text);
      

  11.   

    这样肯定行。
    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..。
    如还有什么问题,可以与我联系,我天天做这个的。
      

  12.   

    我觉得是这样的
    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中去运行,得到更多信息,直到其正确为止,就能找出问题所在了。
    记着,空格一定不能省的,能多不能省!
      

  13.   

    >>shenzhe
    注意这个问题:
    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:='';
      

  14.   

    经过试验一下是正确代码
    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
     
      

  15.   

       当然可以用“表名.域名”的格式,但是如果你当前操作的域就在当前的表里,而且是对单表操作,那么一定可以可以省去表名,只用域名即可。不过仁兄(我想不会是个女侠吧),你这里的“mainbook”应该是表示数据库名吧,那么你上面的什么“mainbook.ze”、“mainbook.kind”、“mainbook.cbs”以及“mainbook.name”等,肯定就是错的了。应该是在它们之间添加个“DB”,如“mainbook.db.ze”。
       我只是路过这里,觉得无聊,近来瞎扯的,有什么贻笑大方的地方,请别见怪呀!
       Good luck。