在三层中如何用param传递参数(50分)

  • 主题发起人 主题发起人 fjx_jwf
  • 开始时间 开始时间
F

fjx_jwf

Unregistered / Unconfirmed
GUEST, unregistred user!
我在应用程序服务器的adodataset1的Parameters中设置了四个参数para1,para2,para3,para4
然后在adodataset1.beforeopen事件中写下
with adodataset1do
begin
Close;
CommandText:='';
//if Parameters.ParamByName('para1').Value='sqlusername' then
//commandtext:='select username from F01username';
if Parameters.ParamByName('para1').Value='systempass' then
commandtext:=format('select dxdm,cxqxdm,xgqxdm,zjscqxdm,dyqxdm,qbqxdm from %s where (username='+'''%s'''+') and (password='+'''%s'''+')',[Parameters.ParamByName('para2').Value,trim(Parameters.ParamByName('para3').Value),trim(Parameters.ParamByName('para4').Value)]);
end;
客户端为:
with clientdataset1do
begin
close;
FetchParams;
Params.ParamByName('para1').AsString:='systempass';
Params.ParamByName('para2').AsString:=ftablename;
Params.ParamByName('para3').AsString:=fusername;
Params.parambyname('para4').AsString:=fpassword;
open;
end;
提示错误为adodataset1:parameter 'para1'没有发现
怎么解决?
 
把adodataset1.beforeopen的事件代码改写在数据集供应器的BeforeExecute中试试
 
我试一下
 
在设计时先把参数取过来,设置好数值,然后打开它,看结果对不对,这个对了以后
再在程序中动态的写。。。
 
我同意wumeng的意见
 
我试了一下数据集供应器的BeforeExecute事件得到的
Parameters.ParamByName('para1').Value值为空
可我明明在客户端给它付过值
 
问题的关键在这里:
CommandText:='';
如果CommandText变了则adoDataset会自动的分析SQL并更新参数。
你试试:
ShowMessage(IntToStr(adodataset1.Parameters.Count));
CommandText:='';
ShowMessage(IntToStr(adodataset1.Parameters.Count));
 
我试一下
 
blue_morning 的是正确的
不过我发现在客户端用clientdataset的execute时将不会触发
应用程序服务器adodataset的beforeopen事件,那么它会触发什么事件呢?adodataset无beforeexecute事件
 
你的思路不对吧?在数据集打开之前修改它的SQL属性。然后还要对SQL的参数赋值?
我的建议是放两个AdoDataSet用两个ClientDataSet分别连接,SQL先写好且不变。
在客户端判断是否为'sqlusername' 是就调用为sqlusername准备的那个,不是就调另外一个
 
to blue_morning:我有四十多个表如果按你的说法,我将在应用程序服务器端放四十多个adodataset和四十多个
数据集供应器,那应用程序服务器上的对象是不是太多了
另外我是先接收参数再对commandtext付值的,所以在adodataset中的beforeopen事件
中可以得到处理,但是它只处理了用open方法打开的,execute方法就不行了
 
你现在可以运行的代码贴出来看看。
 
应用程序服务器端:adstemp为adodataset
procedure Txsgscrmserver.adstempBeforeOpen(DataSet: TDataSet);
var
str:string;
begin
with adstempdo
begin
case Parameters.Items[0].Value of
//1提取所有的用户名
1:str:='select username from F01username';
//2根据用户名和密码提取操作权限
2:str:=format('select dxdm,cxqxdm,xgqxdm,zjscqxdm,dyqxdm,qbqxdm from %s where (username='+'''%s'''+') and (password='+'''%s'''+')',[Parameters.items[1].value,trim(Parameters.items[2].value),trim(Parameters.items[3].Value)]);
//3要据用户名和密码查找是否存在这个用户名
3:str:=format('select username from '+'%s'+' where (username='+'''%s'''+') and (password='+'''%s'''+')',[Parameters.items[1].value,Parameters.items[2].value,Parameters.items[3].value]);
//4修改密码
4:str:=format('update '+'%s'+' set password='+'''%s'''+' where (username='+'''%s'''+') and (password='+'''%s'''+')',[Parameters.items[1].value,Parameters.items[2].value,Parameters.items[3].value,Parameters.items[4].value]);
//5提取一个经济情况的空记录
5:str:='select * from f01jjqkftrq where dqmc='+'''null''';
//6提取片区代码表的所有记录
6:str:='select * from regions';
//7根据经销商代码查经销商详细资料
7:str:=format('select * from f01jxsdak where jxsdm='+'''%s''',[parameters.items[1].value]);
//8生成片区经销商树结构
8:str:='exec f01select';
//9根据地区代码查地区经济情况
9:str:=format('select * from F01jjqkftrq where dqdm='+'''%s''',[parameters.items[1].value]);
end;
Close;
//showmessage(str);
commandtext:=str;
end;
end;
 
with adstempdo
改为: with TADODataSet(Dataset)do
试试
另外是不能进入这个过程procedure Txsgscrmserver.adstempBeforeOpen(DataSet: TDataSet);
我测试我的可以,检查DatasetProvider的属性
 
with adstempdo
改为: with TADODataSet(Dataset)do
会报错"不正确的变量类型"
DatasetProvider的属性没有关于execute的
 
后退
顶部