const
  SQLstr1 = 'select * from order where orderdate between :BeginDate and :EndDate';
  SQLstr2 = 'select *  from  order  where  orderdate  between ''%s'' and''%s''';
var
  cmd;
begin
  with ADODataSet1 do
  begin
    Close;
    CommandText := SQLstr1;
    Parameters.ParamValues['BeginDate']:=DateToStr(DataTimePicker1.Date);
    Parameters.ParamValues['EndDate']:=DataToStr(DataTimePicker2.Date);
    Prepared := True;
    Open;
  end;
  with ADODataSet2 do
  begin
    Close;
    CommandText := Format(SQLstr2,
      [DateToStr(DataTimePicker1.Date), DataToStr(DataTimePicker2.Date)]);
    Open;
  end;
end;
数据库是SQL Server 2000。
我有两个问题:
1.上述两种方法孰优孰劣?
2.我在使用第一种方法的时候,如果不用DateToStr()函数,返回的记录集比用此函数要少,我在查询分析器上用相应的SQL语句得到的结果和用了DateToStr()函数后返回的是一样的。这是什么原因呢?
请高手不吝赐教!

解决方案 »

  1.   

    这不算什么,我发现用Parameters时会出现所传字符串只有一半的情况,比如传的是'中华人民共和国',那么到SQL Sever数据库就只有'中华人','男人'就变成'男'了!莫明奇妙!
      

  2.   

    当你要用类似的SQL句执行多次的时候(只是数据不一样),应该用参数方法,这样可以让DBMS对SQL语句预编译,只编译一次而执行多次。而动态生成SQL语句的方法会导致每次执行都重新编译,从而影响效率。