传递带参数的sql语句??(50分)

  • 主题发起人 主题发起人 coffeeffee
  • 开始时间 开始时间
C

coffeeffee

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi5的三层结构中,从客户端对后台的数据库进行存取,想传递sql语句实现
,并且在sql语句中使用参数,如将clinetdataset的commandtext设为:select * from
t1 where t1.c1>=:c1 ,这样的想法在两层结构中很容易实现,但在三层结构中
不能直接实现,请问如何才能传递一个带参数的的sql语句呢?想听听各位大虾的
意见,请指教!!
 
用format,不在控件里直接加sql语句,而把sql语句放在外面,用的时候再add进去。
var str:string;
begin
str:=format('select * from t1 where t1.c1>=%d',[realvalue]);
clinetdataset1.commandtext:=str;
end;
其中
1.若参数为字符串改%d为''%s''.
2.可带若干参数,但[参数1,参数2,...,参数n]要与前面的%x按顺序一一对应。
 
这是在客户端就生成sql语句的方法吧,的确不错,还有没有其他的方法呢?
 
  但现在sql语句中的参数是不定的,要在程序中动态确定,那么在调用format
函数时就有些麻烦了,format中的第一个参数也就是string类型可以在程序中
生成(合成字符串),但后面的参数如何由程序来动态生成呢?
 
你肯定知道在何时用何参数,
如: 在“条件1”成立时SQL有两个参数,而在“条件1”不成立时只有一个参数
如下:
{动态生成SQL语句}
if 条件1 then
str:='select ..... where c1>%d and c2>%d';
else
str:='select..... where c1=%d';
{动态传递参数}
if 条件1 then
str:=format(str,[realc1,realc2]);
else
str:=format(str,[realc1]);
 
procedure TREQUISITIONS.BitBtn1Click(Sender: TObject);
var s_sql:string;
begin

s_sql := 'SELECT * FROM TREQUISITIONS WHERE COMPID= '+''''+COMPID+'''';
if RG_Status.ItemIndex = 0 then
s_sql := s_sql +' AND STATUS= '+''''+'N'+''''
else
s_sql := s_sql +' AND STATUS= '+''''+'E'+'''';
if E_RequisitionNo.Text <> '' then
s_sql := s_sql + ' AND REQUISITIONNO= '+''''+copy(E_RequisitionNo.Text,5,5)+'''' ;
showmessage(s_sql);
CDS_REQUISITIONS.Close ;
CDS_REQUISITIONS.CommandText := s_sql;
CDS_REQUISITIONS.Open ;
end;

procedure TREQUISITIONS.BitBtn3Click(Sender: TObject);
begin
if CDS_Requisitions.FieldByName('STATUS').Value='N' then
begin
CDS_U_STATUS.CLOSE ;
CDS_U_STATUS.Params.ParamByName('S').Value := 'E' ;
CDS_U_STATUS.Params.ParamByName('ID').Value
:= CDS_Requisitions.FieldByName('COMPID').Value ;
CDS_U_STATUS.Params.ParamByName('NO').Value
:= CDS_Requisitions.FieldByName('REQUISITIONNO').Value ;
CDS_U_STATUS.Execute ;
CDS_Requisitions.refresh ;
showmessage('申请单:'+CDS_Requisitions.FieldByName('TABLENO').ASSTRING+' 已录入生效!');
end
else
begin
CDS_U_STATUS.CLOSE ;
CDS_U_STATUS.Params.ParamByName('S').Value := 'G' ;
CDS_U_STATUS.Params.ParamByName('ID').Value
:= CDS_Requisitions.FieldByName('COMPID').Value ;
CDS_U_STATUS.Params.ParamByName('NO').Value
:= CDS_Requisitions.FieldByName('REQUISITIONNO').Value ;
CDS_U_STATUS.Execute ;
CDS_Requisitions.refresh ;
showmessage('申请单:'+CDS_Requisitions.FieldByName('TABLENO').ASSTRING+' 已最终生效!');
end;
end;

{begin
UPDATE TREQUISITIONS
SET STATUS=:S
WHERE REQUISITIONNO=:NO
AND COMPID=:ID;
COMMIT;
end;
}
 
procedure TREQUISITIONS.BitBtn1Click(Sender: TObject);
var s_sql:string;
begin

s_sql := 'SELECT * FROM TREQUISITIONS WHERE COMPID= '+''''+COMPID+'''';
if RG_Status.ItemIndex = 0 then
s_sql := s_sql +' AND STATUS= '+''''+'N'+''''
else
s_sql := s_sql +' AND STATUS= '+''''+'E'+'''';
if E_RequisitionNo.Text <> '' then
s_sql := s_sql + ' AND REQUISITIONNO= '+''''+copy(E_RequisitionNo.Text,5,5)+'''' ;
showmessage(s_sql);
CDS_REQUISITIONS.Close ;
CDS_REQUISITIONS.CommandText := s_sql;
CDS_REQUISITIONS.Open ;
end;

procedure TREQUISITIONS.BitBtn3Click(Sender: TObject);
begin
if CDS_Requisitions.FieldByName('STATUS').Value='N' then
begin
CDS_U_STATUS.CLOSE ;
CDS_U_STATUS.Params.ParamByName('S').Value := 'E' ;
CDS_U_STATUS.Params.ParamByName('ID').Value
:= CDS_Requisitions.FieldByName('COMPID').Value ;
CDS_U_STATUS.Params.ParamByName('NO').Value
:= CDS_Requisitions.FieldByName('REQUISITIONNO').Value ;
CDS_U_STATUS.Execute ;
CDS_Requisitions.refresh ;
showmessage('申请单:'+CDS_Requisitions.FieldByName('TABLENO').ASSTRING+' 已录入生效!');
end
else
begin
CDS_U_STATUS.CLOSE ;
CDS_U_STATUS.Params.ParamByName('S').Value := 'G' ;
CDS_U_STATUS.Params.ParamByName('ID').Value
:= CDS_Requisitions.FieldByName('COMPID').Value ;
CDS_U_STATUS.Params.ParamByName('NO').Value
:= CDS_Requisitions.FieldByName('REQUISITIONNO').Value ;
CDS_U_STATUS.Execute ;
CDS_Requisitions.refresh ;
showmessage('申请单:'+CDS_Requisitions.FieldByName('TABLENO').ASSTRING+' 已最终生效!');
end;
end;

{begin
UPDATE TREQUISITIONS
SET STATUS=:S
WHERE REQUISITIONNO=:NO
AND COMPID=:ID;
COMMIT;
end;
}
 
view delphi/demos/midas/poolt/
 
procedure TREQUISITIONS.BitBtn1Click(Sender: TObject);
var s_sql:string;
begin

s_sql := 'SELECT * FROM TREQUISITIONS WHERE COMPID= '+''''+COMPID+'''';
if RG_Status.ItemIndex = 0 then
s_sql := s_sql +' AND STATUS= '+''''+'N'+''''
else
s_sql := s_sql +' AND STATUS= '+''''+'E'+'''';
if E_RequisitionNo.Text <> '' then
s_sql := s_sql + ' AND REQUISITIONNO= '+''''+copy(E_RequisitionNo.Text,5,5)+'''' ;
showmessage(s_sql);
CDS_REQUISITIONS.Close ;
CDS_REQUISITIONS.CommandText := s_sql;
CDS_REQUISITIONS.Open ;
end;

procedure TREQUISITIONS.BitBtn3Click(Sender: TObject);
begin
if CDS_Requisitions.FieldByName('STATUS').Value='N' then
begin
CDS_U_STATUS.CLOSE ;
CDS_U_STATUS.Params.ParamByName('S').Value := 'E' ;
CDS_U_STATUS.Params.ParamByName('ID').Value
:= CDS_Requisitions.FieldByName('COMPID').Value ;
CDS_U_STATUS.Params.ParamByName('NO').Value
:= CDS_Requisitions.FieldByName('REQUISITIONNO').Value ;
CDS_U_STATUS.Execute ;
CDS_Requisitions.refresh ;
showmessage('申请单:'+CDS_Requisitions.FieldByName('TABLENO').ASSTRING+' 已录入生效!');
end
else
begin
CDS_U_STATUS.CLOSE ;
CDS_U_STATUS.Params.ParamByName('S').Value := 'G' ;
CDS_U_STATUS.Params.ParamByName('ID').Value
:= CDS_Requisitions.FieldByName('COMPID').Value ;
CDS_U_STATUS.Params.ParamByName('NO').Value
:= CDS_Requisitions.FieldByName('REQUISITIONNO').Value ;
CDS_U_STATUS.Execute ;
CDS_Requisitions.refresh ;
showmessage('申请单:'+CDS_Requisitions.FieldByName('TABLENO').ASSTRING+' 已最终生效!');
end;
end;

{begin
UPDATE TREQUISITIONS
SET STATUS=:S
WHERE REQUISITIONNO=:NO
AND COMPID=:ID;
COMMIT;
end;
}
 
看来只能如此了,其实都是在客户端生成sql语句,我的查询条件含有日期类型,那就需要
将日期类型转换成字符串,并且在sql语句中再调用函数将字符串转成日期型,而且需要存取
当前的日期格式,真是费力不讨好的工作啊(幸亏字段的类型不多)。。。
 
coffeeffee:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
有一个比较笨的方法!
创建一个没用的TQuery,先将语句及参数赋值到此Query中,然后再赋给ClientDataSet即可。
ClientDataSet1.CommandText := Query1.Text;
ClientDataSet1.Params := Query1.Params;
ClientDataSet1.Open;
可以试一试!
 
多人接受答案了。
 
后退
顶部