C# ORA-08103程序错误

C# ORA-08103程序错误,c#,oracle,stored-procedures,odp.net,C#,Oracle,Stored Procedures,Odp.net,我在Oracle上有一个过程,如果我使用下面的代码从SQL Developer调用它,它会运行得非常好: VARIABLE x REFCURSOR exec MY_PROCEDURE('par1', 'par2', 'par3', 'par4' ,:x); PRINT x; 如果我尝试从我的.Net应用程序(使用ODP.Net)调用它,我会得到以下错误: Oracle.DataAccess.Client.OracleException ORA-08103: object no longer e

我在Oracle上有一个过程,如果我使用下面的代码从SQL Developer调用它,它会运行得非常好:

VARIABLE x REFCURSOR
exec MY_PROCEDURE('par1', 'par2', 'par3', 'par4' ,:x);
PRINT x;
如果我尝试从我的.Net应用程序(使用ODP.Net)调用它,我会得到以下错误:

Oracle.DataAccess.Client.OracleException ORA-08103: object no longer exists
这是我用来称呼它的代码:

OracleConnection con = new OracleConnection();
con.ConnectionString = dbConnectionString; //string with the connectio. It is fine because I can connect

OracleCommand cmd = new OracleCommand("MY_PROCEDURE", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;

cmd.Parameters.Add(new OracleParameter("par1", OracleDbType.Varchar2)).Value = var1;
cmd.Parameters.Add(new OracleParameter("par2", OracleDbType.Varchar2)).Value = var2;
cmd.Parameters.Add(new OracleParameter("par3", OracleDbType.Varchar2)).Value = var3;
cmd.Parameters.Add(new OracleParameter("par4", OracleDbType.Varchar2)).Value = var4;

OracleParameter ref_cursor = new OracleParameter();
ref_cursor.OracleDbType = OracleDbType.RefCursor;
ref_cursor.Direction = ParameterDirection.Output;
cmd.Parameters.Add(ref_cursor);

con.Open();

OracleDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{  ...   }
cmd.ExecuteReader命令实际上“起作用”,应用程序异常在
dr.read
上抛出,但是如果我检查
dr
对象,在
hasRows
属性上,我可以看到
ORA-08103:对象不再存在
错误

有什么不对劲?
一个细节是,我有一个类似的过程,它遵循几乎相同的逻辑(返回游标),工作正常。

返回游标的查询是否涉及临时表?如果返回一个涉及临时表的游标,并使用ON COMMIT DELETE ROWS选项,然后在检索游标数据之前提交事务,那么您可能会自食其果

提交很容易发生,因为ODP.NET默认在自动提交模式下工作

为了解决这个问题

  • 或者关闭自动提交
  • 或者使用带有“提交时保留行”选项的临时表(而不是“提交时删除行”)
  • 或者使用常规表格

您还可以为连接创建事务,并在OracleCommand对象中设置该事务


它还可以防止在检索所有数据之前发生提交。

谢谢codo!提交时保留行最终成为问题:)