一个存储过程返回多个表的问题

starsong 2008-11-10 09:56:33
现有一个存储过程中有多条select语句:select col1,co2 from table1,select col1,co2 from table2,select col1,co2 from table3 ,
现在想在程序端通过访问存储过程返回的数据集的表的方式获取数据,比如返回的是ds,要想采用ds.table[0],ds.table[1],ds.table[2]获取数据,这个数据操作类要如何写?谢谢
...全文
688 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolukatie 2008-11-10
  • 打赏
  • 举报
回复
public static DataSet ExecuteDataSet(ref OleDbConnection Conn, CommandType cmdType,
string cmdText, ref OleDbTransaction cmdTrans, params OleDbParameter[] cmdParams)
{
DataSet tmpDataSet = new DataSet();
OleDbCommand tmpCmd = new OleDbCommand();
OleDbDataAdapter tmpAdapter = new OleDbDataAdapter();
tmpCmd.Connection = Conn;
tmpCmd.CommandText = cmdText;
tmpCmd.CommandType = cmdType;

//写入参数
if (cmdParams != null)
{
foreach(OleDbParameter parm in cmdParams)
{
tmpCmd.Parameters.Add(parm);
}
}

//适配器将数据写入DataSet
tmpAdapter.SelectCommand = tmpCmd;
tmpAdapter.Fill(tmpDataSet);
tmpCmd.Parameters.Clear();
return tmpDataSet;
}
starsong 2008-11-10
  • 打赏
  • 举报
回复
问题解决,是采用adapter.fill(ds)方式处理,谢谢各位!
xiaolukatie 2008-11-10
  • 打赏
  • 举报
回复
应该不会吧,楼主你存储过程有写好么?只要你最后返回的是
select col1,co2 from table1
select col1,co2 from table2
select col1,co2 from table3
那么你最后获得的数据集一定是有3个的,那样你DS里面的DATATABLE也会是3个的
你看看运行下存储过程,返回的是不是三个数据结果
JeffChung 2008-11-10
  • 打赏
  • 举报
回复
adapter.fill(ds)
starsong 2008-11-10
  • 打赏
  • 举报
回复
可能是我没有说明白,我的意思是我有一个存储过程,会返回多张表的数据,每一张对返回来的一个ds下的table,现在的情况是使用我现有的数据操作类返回来的ds总是只有第一张表的数据.
shihuan10430049 2008-11-10
  • 打赏
  • 举报
回复
我也想知道,帮顶.
killer_liqiao 2008-11-10
  • 打赏
  • 举报
回复
up
Teng_s2000 2008-11-10
  • 打赏
  • 举报
回复
很是不明白lz的意思
ryb_cool 2008-11-10
  • 打赏
  • 举报
回复
你说的这种情况,用存储过程是可以解决的,用个游标就可以了,然后在客户端用DataSet或List接收都可以。下面给你个存储过程的例子吧:

create or replace procedure PC_IN_OUT_STOCK(MESSAAAGEID IN VARCHAR2,
MATERIELDESC1 IN VARCHAR2,
MATERIELDESC2 IN VARCHAR2,
intReturnFlag out integer, --操作返回标示
messageText out varchar2

) is

ReturnIn integer;
ReturnOut integer;
--intMoveType varchar2(3);
--DTOCKID VARCHAR2(8);
--DTOCKID1 VARCHAR2(8);
--messageTextmain varchar2(200);
messageTextIN varchar2(200);
messageTextOUT varchar2(200);
--stockmode varchar2(10); --批次管理标识
--stockmoid varchar2(10); --批次管理标识
--stockmoidNo varchar2(10);
--PIECECOUNT varchar2(10);
cursor csrInStock is
select tstk_add.c_storageinfoid,
tstk_add.c_matmaindataid,
tstk_add.c_stockmode,
tstk_add.c_stockstate,
tstk_add.c_stocktype,
tstk_add.c_batchid,
tstk_add.c_pieceid,
tstk_add.n_weight,
tstk_add.c_measurementunits,
tstk_add.n_piececount,
tstk_add.c_pieceunits,
tstk_add.c_materieldocid,
tstk_add.i_ldgmonth,
tstk_add.c_ldgyear,
tstk_add.c_timestamp,
tstk_add.c_extendfielda

from Tstk_Addstocklistinfo tstk_add
where tstk_add.c_materieldocid = MATERIELDESC1;

cursor csroutStock is
select tstk_sub.C_PIECEUNITS, --件数单位
tstk_sub.C_STOCKREMARK, --库存备注
tstk_sub.C_MATERIELDOCID, --物料凭证号
tstk_sub.C_STOCKMODE, --库存管理方式
tstk_sub.I_LDGMONTH, --帐务月
tstk_sub.C_LDGYEAR, --帐务年
tstk_sub.C_STORAGEINFOID, --库房编码
tstk_sub.C_MATMAINDATAID, --物料编码
tstk_sub.C_STOCKSTATE, --库存状态
tstk_sub.C_STOCKTYPE, --库存类型
tstk_sub.I_ISNOHOTSENDOFF, --是否热送
tstk_sub.C_BATCHID, --批次号
tstk_sub.C_PIECEID, --件次号
tstk_sub.N_WEIGHT, --重量
tstk_sub.C_MEASUREMENTUNITS, --重量单位
tstk_sub.C_MATERIELDOCYEAR, --物料凭证年号
tstk_sub.N_PIECECOUNT, --件数
tstk_sub.C_EXTENDFIELDA, --入库时间
tstk_sub.C_TIMESTAMP --时间戳
from tstk_substractstocklistinfo tstk_sub
where tstk_sub.c_materieldocid = MATERIELDESC1;
begin
--intReturnFlag := 0;
for cscIn in csrInStock loop
begin
PC_OUT_STORAGE_METHOD_1(trim(cscIn.c_matmaindataid), --物料编码
cscIn.c_storageinfoid, --库房ID
cscIn.c_batchid, --批次号
cscIn.c_pieceid, --件次号
to_char(cscIn.c_materieldocid), --凭证号
'自由', --自由、质检、冻结
cscIn.c_stockmode, --大宗、批次、件次
'自由', --自由、销售、委外
to_char(cscIn.n_weight), --数量
cscIn.c_measurementunits, --计量单位
cscIn.n_piececount, --件数
cscIn.n_piececount, --件数单位
cscIn.c_ldgyear, --帐物年
cscIn.i_ldgmonth, --帐物月
ReturnOut,
messageTextOUT);
--if ReturnIn = 0 then
--goto RETURNERROR;
--end if;
end;
end loop;
for cscOut in csroutStock loop
begin
PC_STORAGEMETHOD1(cscOut.C_PIECEUNITS, --件数单位
cscOut.C_STOCKREMARK, --备注
to_char(MATERIELDESC2), --凭证号
cscOut.C_STOCKMODE, --大宗、批次、件次
cscOut.i_ldgmonth, --帐物月
cscOut.c_ldgyear, --帐物年
cscOut.C_STORAGEINFOID, --库房ID
trim(cscOut.c_materieldocid), --物料编码
'自由', --自由、质检、冻结
'自由', --自由、销售、委外
to_char(cscOut.I_ISNOHOTSENDOFF), --移动类型
cscOut.C_BATCHID, --批次号
cscOut.C_PIECEID, --件次号
to_char(cscOut.N_WEIGHT), --数量
cscOut.C_MEASUREMENTUNITS, --计量单位
cscOut.C_MATERIELDOCYEAR, --物料凭证年
cscOut.N_PIECECOUNT, --件数
to_char(sysdate, 'yyyy-MM-dd hh24:mi:ss'),
ReturnIn,
messageTextIN);
end;
end loop;
--<<RETURNERROR>>
--if intReturnFlag = 0 then
--messageText := ': ' || messageTextmain || ' 入库错误:' ||
-- messageTextIN || ',出库错误:' || messageTextOUT;

--intReturnFlag := 0;
--rollback;
-- end if;

exception
when others then
rollback;
begin
--intreturn := 0;
--intMessage:=intMessage || substr(SQLCODE || SQLERRM,1,200);
--intMessage := messageText;
rollback;
end;
end PC_IN_OUT_STOCK;

你先试着看一下,或许会给你一点提示!希望你能有所收获!
linux_ch 2008-11-10
  • 打赏
  • 举报
回复
去看基礎的東西吧
starsong 2008-11-10
  • 打赏
  • 举报
回复
没人?
twtetg 2008-11-10
  • 打赏
  • 举报
回复
mark

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧