这样的sql语句在delphi中如何动态实现?(65分)

  • 主题发起人 主题发起人 wjbys
  • 开始时间 开始时间
W

wjbys

Unregistered / Unconfirmed
GUEST, unregistred user!
通过下面的sql语句
SELECT name,status,time
FROM table
WHERE name= '张三'
AND time >= DATE('19-Apr-00 0:00')
AND time <= DATE('19-Jan-01 6:00')
得到:
name status time
张三 门诊 2000-06-05 16:00
张三 保健 2000-07-05 04:01
张三 学习 2000-08-05 12:00
张三 保健 2000-10-06 23:01
张三 保健 2000-10-21 11:01
张三 学习 2000-11-06 13:35
张三 门诊 2000-12-07 04:00
。。。。
严格按照以上sql语句格式,如何写一个以 name ,date为参变量的sql语句?(65元只有这么多了)。
 
1. 用参数:
SELECT name,status,time
FROM table
WHERE name= :name // '张三' String
AND time >= :DATE1 // DATE('19-Apr-00 0:00') DateTime
AND time <= :DATE2 // DATE('19-Jan-01 6:00') DateTime

2.动态写SQL语句:
WITH query1 DO
BEGIN
CLOSE;
SQL.Clear;
SQL.APPEND('SELECT name,status,time FROM table ');
SQL.APPEND('WHERE name= ')
SQL.APPEND(format('%s',['张三']);
SQL.APPEND(format('AND time >= %s',[ DATETOSTR('19-Apr-00 0:00')]);
SQL.APPEND(format('AND time =< %s',[ DATETOSTR('19-Jan-01 6:00')]);
OPEN;
END;

 
to lishding:我对sql很不熟,能不能帮我写一个以 name ,date为参变量的动态sql语句?
非常感谢。
 
动态写SQL语句:
WITH query1 DO
BEGIN
CLOSE;
SQL.Clear;
SQL.ADD('SELECT name,status,time FROM table ');
SQL.ADD('WHERE name=:name ')
SQL.ADD('AND time >= :DATE1 ');
SQL.ADD('AND time <= :DATE2');
Prepare;
ParamByname('name').AsString:='张三';
ParamByname('Date1').AsDateTime:=StrToDateTime('19-Apr-00 0:00');
ParamByname('Date2').AsDateTime:=StrToDateTime('19-Jan-01 6:00');
ExecSQL;
END;
 
SELECT name,status,time
FROM table
WHERE name= '张三'
AND time between :Date1 and :date2
 
select name,status,time
from table
where name=:vname
and time between :vDate1 and :vData2
 
大家给你的答案都可行,你可以结束了!
 
很感谢大家的答案
 
在ADOQuery或是Query的SQLString直接下Select * From 你的Table。
我以下的用法是将 SQLString的文字写入到StringList中再从 StringList读出加判断条件即可。
可用以下procedure做修改就可以动态的查询了
procedure TClass1.ChangeSQL( const SearchValue: WideString);
var
AValueStringList,ByStringList:TStringList;
i,j,k:integer;
begin
AValueStringList:=TStringList.Create;
ByStringList:=TStringList.Create;
AValueStringList.Text:=SearchValue;

dtRP1501.Close;

//Reset SQL
for i:=dtRP1501.SQL.Count-1 Downto 0 do
if (pos('ORDER BY',UpperCase(dtRP1501.SQL))>0) or (pos('GROUP BY',UpperCase(dtRP1501.SQL))>0) then
begin
ByStringList.add(dtRP1501.SQL);
dtRP1501.SQL.Delete(i);
end;

for j:=dtRP1501.SQL.Count-1 Downto 0 do
if (Pos(' ',dtRP1501.SQL[j])<>0) and (Pos(' as ',dtRP1501.SQL[j])=0) then dtRP1501.SQL.Delete(j);

if (AValueStringList[0]<>'') and (AValueStringList[0]<>'*') then
//dtView4.SQL.Add(' AND QCMTDT10.RemeltDATE='+sqldate1(AValueStringList[0],2));
dtRP1501.SQL.Add(' AND QCMTDT10.RemeltDATE='+''''+AValueStringList[0]+'''');

if ByStringList.count > 0 then
for k:= ByStringList.count-1 downto 0 do
dtRP1501.SQL.Add(ByStringList[k]);

dtRP1501.Open;
end;
 
接受答案了.
 
后退
顶部