oracle无效得rowid,oracle存储过程被调用时出现"rowid"无效或"对象不再存在"的解决方法...

自己在写ASP.net程序时,需要调用以前的数据库,由于自己刚接触asp.net和oracle。所以在程序中调用存储过程时真是煞费苦心。刚一开始,自己不知道怎么写,在网上搜索,终于找到了关于这方面的源码,但这些源码都是纯粹的把结果集写入表来使用。由于自己不太懂表和临时表的区别,所以在改过网上的源码后还是不能调出结果集,一直提示"rowid无效"或"当前对象不再存在"。自己在网上搜索了很多关于这方面的帖子,但讲解的方法却大同小异,根本解决不了问题。自己是百思不得其解。今天早上,来到办公室,实在是做不下去了,于是去问项目经理,问题在哪。自己在pl/sql中测试的很正常。而且自己在asp.net中调用其它的存储过程是可以成功的。项目经理说:它们两个存储过程返回的结果集插入的都是临时表吗?我说:是,都是以T_TMP开头的。但当项目经理从表->view->viewSQL查看到sql语句时,我傻眼了,调用成功的那个竟然是table,而非temporary table。这是他说只要是临时表,在调用存储过程时,必须要加事务,这样才能被调用成功。真是醍醐灌顶啊。自己就是没有加事务。只需要加一句begintransaction,就可以了。并且个人以为以T_TMP_RPT开头的表是临时表(个人观点不一定十分准确)。最终成功的代码为:

OracleTransaction ot = null;//事务

OracleConnection oraCon = null;//连接

OracleCommand cmd = null;//命令行用于添加存储过程或包

DataSet myds = new DataSet();//结构集

OracleDataAdapter myda = null;

try

{

string strCon = "data source=whyd;user id=whyd;password=whyd123";//连接语句

oraCon = new OracleConnection(strCon);

oraCon.Open();//打开连接

ot = oraCon.BeginTransaction();//开始事务

cmd = new OracleCommand("pg_rpt_fjkwlddml.p_rpt_fjkwlddml", oraCon);//写入存储过程或包名称

cmd.CommandType = CommandType.StoredProcedure;//执行命令行方式,有三种

//添加存储过程参数

OracleParameter p_cursor = new OracleParameter("p_cursor", OracleDbType.RefCursor);

p_cursor.Direction = ParameterDirection.Output;

OracleParameter s_rq1 = new OracleParameter("s_rq1", OracleDbType.Varchar2);

s_rq1.Direction = ParameterDirection.Input;

s_rq1.Value = "20110801";

OracleParameter s_rq2 = new OracleParameter("s_rq2", OracleDbType.Varchar2);

s_rq2.Direction = ParameterDirection.Input;

s_rq2.Value = "20110815";

OracleParameter s_jrjc = new OracleParameter("s_jrjc", OracleDbType.Varchar2);

s_jrjc.Direction = ParameterDirection.Input;

s_jrjc.Value = "1";

cmd.Parameters.Add(p_cursor);

cmd.Parameters.Add(s_rq1);

cmd.Parameters.Add(s_rq2);

cmd.Parameters.Add(s_jrjc);

//ot.Commit();

myda = new OracleDataAdapter(cmd);

myda.Fill(myds);//放入结果集

}

catch (OracleException e)

{

throw new Exception(e.Message);

}

finally

{

if (!myda.Equals(null))

{

myda.Dispose();

}

if (!cmd.Equals(null))

{

cmd.Parameters.Clear();//清空参数

cmd.Dispose();

}

oraCon.Close();

}

GridView1.DataSource = myds;//数据源指定             GridView1.DataBind();//绑定数据源             oraCon.Close();//关闭连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值