当前位置: > 数据库 > Oracle >

oracle存储过程被调用时出现"rowid"无效或"对象不再存在"的

时间:2014-09-13 13:07来源:linux.it.net.cn 作者:it

自己在写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();//关闭连接

(责任编辑:IT)
------分隔线----------------------------