自己在写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) |