本人用delphi7 的TADOStoredProc调用mysql 的存储过程。在存储过程不需要传入参数的时候,能顺利获取到返回的数据集。
存储过程代码如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
begin
DECLARE GoodsID int default 0;
DECLARE no_more_products, quantity_in_stock INT DEFAULT 0;
DECLARE cur_product CURSOR FOR select distinct goods_id from ecs_order_goods;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products=1; drop table if exists tmptable;
create TEMPORARY table tmptable
(
ID INT(11) NOT NULL AUTO_INCREMENT,
strInfo varchar(1000),
strTotal varchar(500),
primary key (ID)
);
OPEN cur_product;
fetch cur_product into GoodsID;
REPEAT
INSERT INTO tmptable(strInfo) VALUES('123');
fetch cur_product into GoodsID;
UNTIL no_more_products=1
END REPEAT;
CLOSE cur_product; SELECT * FROM tmptable;
DROP TABLE tmptable;
end;delphi调用代码如下:
with spExec do
begin
Close;
ProcedureName:='ecs_test';
Parameters.Clear;
Prepared := false;
//Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
prepared:=true;
Open;
....
end;然后我在过程声明中添加传入参数,其它内容不变。
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in iUserID int)
begin
... /* 所有的代码不变。 */
end;delphi调用代码改为如下:
iRow := 1;
with spExec do
begin
Close;
ProcedureName:='test';
Parameters.Clear;
Prepared := false;
Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
prepared:=true;
Open;
....
end;
结果就执行报错,如图所示:
如果此时把存储过程的内容删除,随便添加一条 select语句返回一个数据集,又没有问题,说明参数传入应该没错。请诸位达人指点迷津,谢谢!
存储过程代码如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
begin
DECLARE GoodsID int default 0;
DECLARE no_more_products, quantity_in_stock INT DEFAULT 0;
DECLARE cur_product CURSOR FOR select distinct goods_id from ecs_order_goods;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products=1; drop table if exists tmptable;
create TEMPORARY table tmptable
(
ID INT(11) NOT NULL AUTO_INCREMENT,
strInfo varchar(1000),
strTotal varchar(500),
primary key (ID)
);
OPEN cur_product;
fetch cur_product into GoodsID;
REPEAT
INSERT INTO tmptable(strInfo) VALUES('123');
fetch cur_product into GoodsID;
UNTIL no_more_products=1
END REPEAT;
CLOSE cur_product; SELECT * FROM tmptable;
DROP TABLE tmptable;
end;delphi调用代码如下:
with spExec do
begin
Close;
ProcedureName:='ecs_test';
Parameters.Clear;
Prepared := false;
//Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
prepared:=true;
Open;
....
end;然后我在过程声明中添加传入参数,其它内容不变。
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in iUserID int)
begin
... /* 所有的代码不变。 */
end;delphi调用代码改为如下:
iRow := 1;
with spExec do
begin
Close;
ProcedureName:='test';
Parameters.Clear;
Prepared := false;
Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
prepared:=true;
Open;
....
end;
结果就执行报错,如图所示:
如果此时把存储过程的内容删除,随便添加一条 select语句返回一个数据集,又没有问题,说明参数传入应该没错。请诸位达人指点迷津,谢谢!
with spExec do
begin
Close;
ProcedureName:='test';
Prepare;
ParamByName('iUserID').Value := 4; //4还是iRow?不太明白
//Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
Open;
....
end;
with spExec do
begin
Close;
ProcedureName:='test';
Prepared := True;
Parameters.ParamByName('iUserID').Value := iRow;
//Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
Open;
end;
with spExec do
begin
Close;
ProcedureName:='test';
Parameters.Clear;
Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
Open;
end;
//也可以这样写
with spExec do
begin
Close;
ProcedureName:='TestProc';
Parameters.Refresh;
Parameters.ParamByName('@iUserID').Value := iRow;
Open;
end;
这几天尝试了一下fircedac,基本上和ADO差不多,但是很多不一样的地方就抓瞎了,网上的教程也很少,果断的放弃了,哈哈
自己定义的类和接口(interface)写在一个单元里面,如果要把FireDAC换成ADO,把那个单元里面的类换成在ADO基础上写的类就可以了。
这样的话,不管你的程序多大、有多少地方涉及数据库访问,也不管是换成UniDAC、ADO、DBExpress或SDAC等,所需的工作量就很少了。