我写的一个记录查询函数FixQry,表名车辆维修记录详表,包含车号、日期等字段,用车号、年、月查询,代码中的S2和S3字段用year(日期)和mounth(日期)返回时间的年和月,DAHelper.ExeSqlQuery是一个执行SQL语句的函数,返回TADOQuery,执行FixQry总是提示sql赋值一句出错,请高手帮忙改错,多谢!
function FixQry(CarNo,FixY,FixM:string):TADOQuery;
var
s1,s2,s3,sql:string;
begin
  if (CarNo='') then                  //车号查询条件
  s1:='1=1'
  else
  s1:='车号='+''''+CarNo+'''';
   if (FixY='') then                 //年查询条件
  s2:='1=1'
  else
  s2:='year(日期)='+''''+FixY+'''';
 if (FixM='') then                   //月查询条件
  s3:='1=1'
  else
  s3:='month(日期)='+''''+FixM+'''';
 sql:='select * from 车辆维修记录表 where '+s1+'and'+s2+'and'+s3;
  result:=DAHelper.ExeSqlQuery(sql);
 end;

解决方案 »

  1.   


    {留意此句在AND的前后要加入空格}
    sql:='select   *   from   车辆维修记录表   where   '+s1+' and '+s2+' and '+s3;
      

  2.   

    感谢GDTOPONE,低级错误,请问“'”到底该怎么用,我经常出错?
      

  3.   

    在Query的SQL里面写语句的时候很容易搞糊涂,例如:
      CodeDM.QueryData.Close;
      CodeDM.QueryData.SQL.Clear;
      CodeDM.QueryData.SQL.Add('select distinct kmYM from aKM where kmYM='''+v_AY+'''');
      CodeDM.QueryData.Open;解释:'select distinct kmYM from aKM where kmYM='''+v_AY+''''
    1.第一个单引号和“=”号后面的第三个单引号是一对,“=”号后面的第一个单引号作转义符用,将“=”号后面第二个单引号转义成SQL认识的单引号。
    2.最后面的四个单引号:其中第一个和最后一个是一对,表示在其中的都是字符,第二个是作转义符用,将第三个转成SQL认识的单引号。 如果搞不清楚,以可以用'select distinct kmYM from aKM where kmYM='+QuotedStr(v_AY)QuotedStr()的用途就是自动在v_AY前后加单引号。 
    以下针对SQL Server数据库进行讨论。例句:With Query1 do
          begin
            close;
            SQL.Clear;
            SQL.Add('select * from Customers where CompanyName = '"+Edit.Text+"'');
                                                                 //要传入一个字符串
            Open;
          end;
    论坛上经常有人为了一句动态加入的SQL语句中的那么多引号犯迷糊。首先,当确定要传入SQL的变量是一个字符串而不是数值时,为了不至于被引号弄糊涂,可以有如下方法:
    1。用参数来解决:
      (1)当传入字串仅是当作字串常量使用时
            Query1.SQL.Add('select * from Customers where CompanyName = :Company');
            Query1.Parambyname('Company').asstring := Edit1.Text;
            ...
      (2)当传入字串要当作日期字段的比较值时,可以用Convert()函数把参数强制为日期型数据,当然,要保证该字串符合转为日期型的条件。
            Query1.SQL.Add('select * from Orders where OrderDate >= Convert(Datetime, :OrderDate )');
            Query1.Parambyname('OrderDate').asstring := Edit1.Text;
            ...
    2。用Delphi的引用串函数QuotedStr()来解决:
       Query1.SQL.Add('select * from Customers where CompanyName = '+ QuotedStr(Edit1.Text));
       ...
       QuotedStr()函数得到的是一个带引用的字符串,即加了引号的字串。
    3。用ASCII码值 #39 代表单引号,组成字串表达式:
       Query1.SQL.Text := 'select * from Customers where CompanyName = '+ #39 + Edit1.Text + #39;
       ...其次,当确定要传入SQL的变量是 数值 时,可以直接把它SQL语句表达式字串相连接,而不须加引号了。例如:
       Query1.SQL.Text := 'select * from Customers where CompanyName = '+ Edit1.Text; 
    //当变量字段时直拉相联
     with adQ do begin
             close;
             sql.Text:='select * from s_splat where '+str_name+'='+QuotedStr(suiedit1.Text);
             open;
           end;
      

  4.   

    感谢 GDTOPONE耐心的讲解,这个我方法我记下了
      

  5.   

    再罗嗦一次 ,GDTOPONE所说:
    1.第一个单引号和“=”号后面的第三个单引号是一对,“=”号后面的第一个单引号作转义符用,将“=”号后面第二个单引号转义成SQL认识的单引号。 
    2.最后面的四个单引号:其中第一个和最后一个是一对,表示在其中的都是字符,第二个是作转义符用,将第三个转成SQL认识的单引号。   
    第一条里等号后面的第一个和第三个单引号是T-SQL的符号还是PASCAL的符号?
    第二条里的第一和第四是是T-SQL的符号还是PASCAL的符号?
    还有开始的select前面的单引号是否需要配对?
    多谢!!