ado存储过程参数
Ⅰ 为什么我用ado 的存储过程怎样也行不通
标准的做法无非是按照以下步骤进行:
1、生成并初始化一个_CommandPtr对象;
2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;
3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数);
4、为_CommandPtr对象指定需要使用的ADO连接;
5、使用_CommandPtr的Execute方法调用存储过程;
6、从结果中获取返回参数的值(如果有的话)。
Ⅱ 关于vb用ado对象连接sql,执行带参数的存储过程
应该和ado的版本有关系 , 你引用高版本的dll试试
Ⅲ ADO或odbc如何创建存储过程和表
【delphi+oracle报表解决方案(一)】delphi中调用oracle的存储过程(分带返回游标,不返回值两种)
关键字: delphi ,oracle存储过程,游标,返回数据集,报表注:delphi 6+ oracle 8.1.6一.创建包与包体1.附:建表aaclass为下面作测试用create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1
AS type rc_class is ref cursor;
--求p1,p2的和与差,返回的多个值通过游标返回
procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class);
--查询满足条件的数据集,返回数据集通过游标返回
procere GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)
procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number) ;
end PKG_JCCTEST1; 3.建包体CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1
ASprocere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class)
IS
BEGIN
open ResultCursor for
select p1-p2 as "sum", p1+p2 as "sub" from al;
END ;
procere GetClass2(a in number,ResultCursor out rc_class )
is
begin open ResultCursor for
select aaclass.* from aaclass where pnumber >a;end ;procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number)
is
begin
insert into aaclass values(p_cid,p_cname,p_pnumber) ;
-- commit;
end ; 二.在delphi中利用AdoDataSet调用上述第一个存储过程
1.利用AdoConnection1连接数据库(驱动为 oracle Provider for OLE DB),
**并在连接字符串中加入这一节: PLSQLRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:
procere TForm1.Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,45为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应
ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4); //下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ; //根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了 //此处的字段名根据包过程中的返回游标 对应的字段名来取
//定义的存储过程返回游标如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from al;
//把对应的字段值取出来即可
AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
BResult := ADODataSet1.Fields.FieldByName('sum').Value ; //显示结果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;end;
三.在delphi中利用AdoDataSet调用上述第二个存储过程
还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procere TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,20为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);
//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ; while not ADODataSet1.Eof do
begin
showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
) ;
ADODataSet1.Next ;
end ;
end; 四 利用adoquery调用第三个过程,不返回数据集的procere TForm1.Button3Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ; AdoQuery1.ExecSQL ;
end;
五 利用adoquery调用第一个过程,返回数据集的.
procere TForm1.Button4Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ; AdoQuery1.Open ; Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
string( AdoQuery1.FieldByName('sum').Value));
end;六.关于三层体系的此类问题两层的解决了,三层类似.
中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;
客户端用clientdataset ,大同小异,举例如下: begin
//调用相应的过程
ClientDataSet1.Close ;
ClientDataSet1.Params.Clear ; ClientDataSet1.CommandText := '{call PackageName.ProcereName(?,?)}' ;
ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1.Open ;
end ;
Ⅳ VB.NET是如何使用ADO让存储过程返回数据表中的值呢求解!
定义了连接和记录集后:
Dim res as new adodb.recordset
res.open "select * from Char1 where id=12",conn,3,3
do while res.eof=false
text1.text=res.fields("fName")
res.movenext
loop
res.close
Ⅳ ADO下怎么通过调用存储过程获取结果集
******************************
晕,有上面这么麻烦吗?
1\打开企业管理器
2\展开左边的树结构,直到看到database
3\右击database,在弹出菜单中找一个项,最后是(K)的,后面还有个三角形的.
4\鼠标指向这一项,又出现一个菜单,其中有一个项,最后是(A)的,点击它,就打开附加数据库的窗口了.
5\在这个窗口内附加数据库,就OK了
Ⅵ Delphi怎样使用存储过程参数
调用存储过程推荐使用Query,Adoquery组件
query.close;
query.sql.clear;
query.sql.add('exec db.prtemp(@id=:id)');
query.parambyname('id').asinteger:=1;
query.open;
----------------------------------------------------------------------------------------------------
也可用Tstoredproc
storedproc1.active=false;
storedproc1.databasename="dbname";
storedproc1.storedprocname="strdprcname";
storedproc1.params.clear;
storedproc1.params.createparam(ftstring,"p1",ptinput);
storedproc1.params.createparam(ftstring,"p2",ptinput);
storedproc1.params.parambyname("p1").asstring:=varstring1;
storedproc1.params.parambyname("p2").asstring:=varstring2;
storedproc1.active=true;
----------------------------------------------------------------------------------------------------
调用存储过程最好使用Query组件,本人就是用Tstoredproc组件而屡屡出错!这一段痛心疾首的错误老是涉及到ISAPI32.dll,让我这个丈二和尚模不到屁股。使用Query控件调用存储过程如下:
加入你的存储过程有两个参数:
CREATE PROCEDURE Procere_Name @proc1 int,@proc2 char(8)
AS
……
则你的Query1控件的代码如下:
With Query1 do
Begin
Close;
SQL.Clear;
SQL.Add(' Exec Procere_Name :proc1,:proc2 ');
ParamByName('proc1').Value:=4;
ParamByName('proc2').Value:='Hello';
Try
ExecSQL;
Except
raise;
End
End
Ⅶ ADO.NET读取存储过程问题
new SqlParameter("@PageCount",SqlDbType.Int)这句重载弄错了吧,通常类型是没必要指定,而应该先声明一个变量,把它放在第二个参数的位置,就像你上面param[0] [1]那样。存储过程的返回值也不是用reader来获取的,而是你指定了Output并ExecuteNonQuery后,SqlParameter的变量就自动赋值了。试试看吧。
Ⅷ ADO.net如何调用带参数的存储过程
cmd.parameters.add(@Count,sqldbtype.int); ---错误,@Count加双引
cmd.Parameters.Add("@Count", SqlDbType.Int);
cmd.parameters= parameterdirection.output; --错误parameters是参数集合。非参数属性
cmd.Parameters["@Count" ].Direction = ParameterDirection.Output;
con.open();
cmd.executenonquery(); --错误:大小写。。失误?
con.close();
tmpid = (int)@count.value;--错误
tmpid = (int)cmd.Parameters["@Count"].value;
