本人用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陳述句回傳一個資料集,又沒有問題,說明引數傳入應該沒錯。
請諸位達人指點迷津,謝謝!
uj5u.com熱心網友回復:
with spExec do
begin
Close;
ProcedureName:='test';
Prepare;
ParamByName('iUserID').Value := 4; //4還是iRow?不太明白
//Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
Open;
....
end;
uj5u.com熱心網友回復:
with spExec do
begin
Close;
ProcedureName:='test';
Prepared := True;
Parameters.ParamByName('iUserID').Value := iRow;
//Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
Open;
end;
uj5u.com熱心網友回復:
不行啊~
uj5u.com熱心網友回復:
with spExec do
begin
Close;
ProcedureName:='test';
Parameters.Clear;
Parameters.CreateParameter('iUserID', ftInteger, pdInput, 4, iRow);
Open;
end;
uj5u.com熱心網友回復:
ado已經是很古老的東西了,建議改用UniDAC。我發現論壇上還有很多人還在用BDE、ADO這類古董,實在令人困惑。uj5u.com熱心網友回復:
慣性而已,估計大部分開發者只用了Delphi 1/10不到的能力而已...uj5u.com熱心網友回復:
//也可以這樣寫
with spExec do
begin
Close;
ProcedureName:='TestProc';
Parameters.Refresh;
Parameters.ParamByName('@iUserID').Value := iRow;
Open;
end;
uj5u.com熱心網友回復:
應用不深的人,比如我這樣的,也就是寫幾個簡單的應用,使部門作業起來簡便一些,反而是習慣了簡單的ADO+MSSQL,太深了反而影響開發了。
這幾天嘗試了一下fircedac,基本上和ADO差不多,但是很多不一樣的地方就抓瞎了,網上的教程也很少,果斷的放棄了,哈哈
uj5u.com熱心網友回復:
另外關鍵是我幾乎不用三層的架構,甚至連存盤都用不著,就是一個連接資料庫、讀寫資料庫、出個表格、備份一下而已,哈哈uj5u.com熱心網友回復:
想簡單的話可以用sdac(用于sql server)和MyDac(用于MySql),可以直連資料庫,根本不需要驅動,從使用的角度來講也比bde或ado更簡單。其實UniDAC也是比較簡單的,而且能連接幾乎所有型別的資料庫,而且其中有不少資料庫是能通過tcpip直連的(不需要驅動),如oracle、sql server、MySQL、DBF等。
我也覺得FireDAC似乎弄得太復雜了,不過熟悉了以后也沒有太大的問題。
uj5u.com熱心網友回復:
其實Delphi還提供了另外一種連接連接資料庫的方式:DBExpress,用起來也算比較簡單,但麻煩之處是:dbx驅動(dll檔案)要隨程式一起發布,不能把它編譯連接在exe檔案里。uj5u.com熱心網友回復:
EMB不把FireDAC做成全能是為了給第三方組件留出一定的生存空間,不是技術問題uj5u.com熱心網友回復:
還是喜歡一些大眾的東西,或者delphi自帶的東西,否則,一是出了問題無從查找解決方案,二是一旦升級delphi而第三方插件沒有跟上,那可就哭死在廁所了,哈哈uj5u.com熱心網友回復:
可以在FireDAC組件(例如FDQuery)的基礎上寫自己的類,并根據這個類定義自己所需的介面(interface),程式存取資料庫只通過這個介面進行。自己定義的類和介面(interface)寫在一個單元里面,如果要把FireDAC換成ADO,把那個單元里面的類換成在ADO基礎上寫的類就可以了。
這樣的話,不管你的程式多大、有多少地方涉及資料庫訪問,也不管是換成UniDAC、ADO、DBExpress或SDAC等,所需的作業量就很少了。
uj5u.com熱心網友回復:
資料存取組件開發公司對各種資料庫存取方式做了抽象化,我也可以對各種不同的存取組件做進一步的抽象化。uj5u.com熱心網友回復:
支持,頂一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/37871.html
標籤:數據庫相關
