C#调用梦数据库存储过程方法

C#调用梦数据库存储过程方法,第1张

//连接字符串

private string strConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString

//连接对象

private SqlConnection conn

private void Form1_Load(object sender, EventArgs e)

{

//实例化连接对象

conn = new SqlConnection(strConn)

}

private void button1_Click(object sender, EventArgs e)

{

//判断是否数据库连接成功

if (conn.State == System.Data.ConnectionState.Closed)

{

//连接数据库

conn.Open()

}

//创建SQL命令对象,GetMaxPrice参数存储过程

using (SqlCommand cmd = new SqlCommand("GetMaxPrice", conn))

{

//将命令类型设为存储过程

cmd.CommandType = CommandType.StoredProcedure

//添加入参

cmd.Parameters.Add(new SqlParameter("@DTypeId",

SqlDbType.Int, 18, "DTypeId"))

//添加出参

cmd.Parameters.Add(new SqlParameter("@DPrice",

SqlDbType.Int, 18, ParameterDirection.Output, false, 0, 0,

"DPrice", DataRowVersion.Default, null))

//添加返回值

cmd.Parameters.Add(new SqlParameter("@return",

SqlDbType.Int,18,ParameterDirection.ReturnValue,true,0,0,

"return",DataRowVersion.Default,null))

//给入参赋值

cmd.Parameters["@DTypeId"].Value = int.Parse(txtEnter.Text)

//执行存储过程

cmd.ExecuteNonQuery()

//获取返回值

var ret = cmd.Parameters["@return"].Value

//获取出参

string price = cmd.Parameters["@DPrice"].Value.ToString()

if ((int)ret >0)

{

textBox1.Text = price

}

}

//关闭连接

conn.Close()

}

【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 )

commit2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1

AS type rc_class is ref cursor

--求p1,p2的和与差,返回的多个值通过游标返回

procedure GetSubAndSum2(p1 number,p2 number ,

ResultCursor out rc_class)

--查询满足条件的数据集,返回数据集通过游标返回

procedure GetClass2(a in number,ResultCursor out rc_class ) --往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)

procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,

p_pnumber number)

end PKG_JCCTEST1 3.建包体CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1

ASprocedure GetSubAndSum2(p1 number,p2 number ,

ResultCursor out rc_class)

IS

BEGIN

open ResultCursor for

select p1-p2 as "sum", p1+p2 as "sub" from dual

END

procedure GetClass2(a in number,ResultCursor out rc_class )

is

begin open ResultCursor for

select aaclass.* from aaclass where pnumber >aend procedure 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.1Password=KXDPersist Security Info=TrueUser ID=KXDData Source=TEST3PLSQLRSet=12.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:

procedure 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 dual

//把对应的字段值取出来即可

AResult := ADODataSet1.Fields.FieldByName('sub').Value

BResult := ADODataSet1.Fields.FieldByName('sum').Value //显示结果

showmessage(inttostr(AResult))

showmessage(inttostr(BResult)) end

三.在delphi中利用AdoDataSet调用上述第二个存储过程

还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procedure 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调用第三个过程,不返回数据集的procedure 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调用第一个过程,返回数据集的.

procedure 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.ClearClientDataSet1.CommandText := '{call PackageName.ProcedureName(?,?)}'

ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput)

ClientDataSet1.Open

end

本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/yzsind/archive/2005/01/20/261176.aspx

如果已经存在一个存储过程A(参数);

那么在存储过程B中可以直接通过:

values := A(参数)即可实现调用。

备注:values必须在初始化过程中进行定义如: values  VARCHAR(30)并且此类型必须与A存储过程返回参数类型一致。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6780494.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-28
下一篇2023-03-28

发表评论

登录后才能评论

评论列表(0条)

    保存