能帮我看看这个adoquery吗?(50分)

  • 主题发起人 主题发起人 bfox
  • 开始时间 开始时间
B

bfox

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add ('UPDATE person SET fcode = (SELECT fcode FROM person WHERE ');
adoquery1.sql.add ('pcode = (SELECT MAX(pcode)FROM person WHERE pcode IN ');
adoquery1.sql.add ('(SELECT pcode FROM person WHERE pname =:pname)))WHERE ');
adoquery1.sql.add ('fcode = (SELECT fcode FROM person WHERE pcode = : fcode) ');
adoquery1.sql.add ('AND pcode <> : pcode ');
adoquery1.open;
end;

运行后报错
project edit2.exe raised exception class eoleexception with message 'the application has improperly defined a parameter object'.process stopped .use step or run to continue.

这个SQL应该没有问题,因为我在sql 7的 query analys 里面试过
简单介绍如下
有一个person 表,表里有pcode(编号) ,pname(名字), fcode(家庭编号)几个字段
如果fcode 相同就说明是一个家庭的,
现在由于操作失误,导致录入了许多姓名相同的人(pname 相同)
现在要把 相同的人删除,但是首先要把和他fcode 相同的纪录的fcode 改到他姓名(pname)相同的人名下
说的可能不够清楚,但是结合sql 语句应该能看懂了
UPDATE person
SET fcode =
(SELECT fcode
FROM person
WHERE pcode =
(SELECT MAX(pcode)
FROM person
WHERE pcode IN
(SELECT pcode
FROM person
WHERE pname = : pname)))
WHERE fcode =
(SELECT fcode
FROM person
WHERE pcode = : fcode) AND pcode <> : pcode
谁能告诉我为什么操作会报错呢??
 
//adoquery1.open;

ADOQuery1.Excute;

 
有数据集结果返回的用OPEN,无数据集结果返回的用EXCUTE。
 
不返回数据时,建议用excute
返回数据时,用open

书上是这么说的,我也一直这么用,没有出过错
 
不行啊 adoquery 没有excute方法
 
adoquery1.execsql
这个方法应该有吧
 
楼上说得对用ExecSQL
 
我覺得應該是': pcode '這些參數有問題
 
你的SQL写在ADOQUERY中,然后定义你的参数类型。执行时先给参数值,
再adoquery1.execsql
 
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add ('UPDATE person SET fcode = (SELECT fcode FROM person WHERE ');
adoquery1.sql.add ('pcode = (SELECT MAX(pcode)FROM person WHERE pcode IN ');
adoquery1.sql.add ('(SELECT pcode FROM person WHERE pname =:pname)))WHERE ');
adoquery1.sql.add ('fcode = (SELECT fcode FROM person WHERE pcode = : fcode) ');
adoquery1.sql.add ('AND pcode <> : pcode ');
adoquery1.Parameters.ParamByName('fcode').Value := '张三';
adoquery1.Parameters.ParamByName('pcode').Value := '111011';
adoquery1.execsql;
end;
 
open改为
ExecSQL
 
改为execsql.后报一样的错误,
我的想法是以当前的pcode,pname ,fcode 作为参数,这个该怎么写啊??
 
那就用动态SQL语句吧:
procedure TfrmOsLandTrace.btbQueryClick(Sender: TObject);
var strBaseSql,strSql,strDateCol:string;
begin
strBaseSql:='select fatNo,dateLend,styleNo,toolType,qtyLand,dateReturn,'+
'qtyReturn,notesLand,notesReturn,createdBy,dateCreated,status '+
' from TosLandTrace where status<>''D''';

strSql:='';
//增加查询条件 //指令号
if trim(edtFatNo.Text)<>'' then
strSql:=strSql + ' and fatNo='''+edtFatNo.Text+'''';
//型体号
if trim(edtStyleNo.Text)<>'' then
strSql:=strSql + ' and styleNo='''+edtStyleNo.Text+'''';
// 外借数
if trim(edtQtyLand.Text) <> '' then
strSql:=strSql + ' and qtyLand='+edtQtyLand.Text;
// 归还数
if trim(edtQtyReturn.Text) <> '' then
strSql:=strSql + ' and qtyReturn='+edtQtyReturn.Text;
//计划类别
if trim(edtToolsType.Text) <> '' then
strSql:=strSql + ' and toolType='''+edtToolsType.Text+'''';

if strSql='' then
begin
Showmessage(btbQuery.Hint);
Exit;
end;
DMOS.cdsOsLandTrace.Close;
DMOS.cdsOsLandTrace.CommandText:=strBaseSql+strSql;
DMOS.cdsOsLandTrace.Open;
end;
 
wumeng 兄,我的程序是用的dbgrid 做的,那个取text 的语句该怎么写啊??
 
你的adoquery1.sql.add ('AND pcode <> : pcode ');
中的PCODE参数是怎么得到的,我的TEXT就怎么取。。。
 
我遇到过类似的问题,我是改成这样:
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add ('UPDATE person SET fcode = (SELECT fcode FROM person WHERE ');
adoquery1.sql.add ('pcode = (SELECT MAX(pcode)FROM person WHERE pcode IN ');
adoquery1.sql.add ('(SELECT pcode FROM person WHERE pname ='+''''+pname+'''');
adoquery1.sql.add (')))WHERE fcode = (SELECT fcode FROM person WHERE pcode ='+''''+fcode+'''' );
adoquery1.sql.add (') AND pcode <>'+''''+pcode+''' ');
adoquery1.execsql;
end;
 
不好意思,分不够多
 
多人接受答案了。
 
后退
顶部