“错误”;取出顺序错误“;从C#中的Oracle函数返回表,其中函数使用数据库链接到SQL Server
在C代码中,我试图从Oracle函数加载数据表。该函数具有“错误”;取出顺序错误“;从C#中的Oracle函数返回表,其中函数使用数据库链接到SQL Server,c#,sql-server,oracle,C#,Sql Server,Oracle,在C代码中,我试图从Oracle函数加载数据表。该函数具有SYS\u REFCURSOR返回类型。这是我的代码,它尝试使用以下函数填充数据表dt: using (var connection = new OracleConnection(connstring)) { connection.Open(); using (var command = new OracleCommand()) { command.Connection = connection;
SYS\u REFCURSOR
返回类型。这是我的代码,它尝试使用以下函数填充数据表dt
:
using (var connection = new OracleConnection(connstring))
{
connection.Open();
using (var command = new OracleCommand())
{
command.Connection = connection;
command.CommandText = "FNC_AXA_APPTS";
command.CommandType = CommandType.StoredProcedure;
OracleParameter retVal = new OracleParameter("PRS", OracleDbType.RefCursor);
retVal.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(retVal);
command.Parameters.Add(new OracleParameter("EG_PARAM", OracleDbType.Varchar2, 50)).Value = paramValue;
command.ExecuteNonQuery();
using (OracleDataReader reader = ((OracleRefCursor)command.Parameters["PRS"].Value).GetDataReader())
{
dt.Load(reader);
}
}
}
在某些情况下,Oracle函数使用指向SQL数据库的数据库链接。在这些情况下,我得到以下例外
ORA-01002: fetch out of sequence
ORA-02063: preceding line from GATE_LINK
。。。其中GATE\u LINK
是数据库链接。到目前为止,我的研究证实,问题一定出在dblink上
我们正在使用用于.NET的Oracle数据提供程序-这是否可能不支持到SQL Server的dblink?或者,如果有,我可以在SQL端配置什么来解决这个问题
我应该提到,我们通过VPN连接到Oracle DB,连接字符串使用以下格式:
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})));User Id={3};Password={4};"
提前感谢…我花了一天多的时间研究这个问题,在发布我的问题10分钟后,我被引导到了答案。典型的 答案就在这里——所需的只是将调用代码包装到事务中。工作代码如下所示:
using (var connection = new OracleConnection(connstring))
{
connection.Open();
using (var command = connection.CreateCommand())
{
// Start a local transaction
using (var transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
// Assign transaction object for a pending local transaction
command.Transaction = transaction;
command.CommandText = "FNC_AXA_APPTS";
command.CommandType = CommandType.StoredProcedure;
OracleParameter retVal = new OracleParameter("PRS", OracleDbType.RefCursor);
retVal.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(retVal);
command.Parameters.Add(new OracleParameter("EG_PARAM", OracleDbType.Varchar2, 50)).Value = paramValue;
command.ExecuteNonQuery();
using (OracleDataReader reader = ((OracleRefCursor)command.Parameters["PRS"].Value).GetDataReader())
{
dt.Load(reader);
}
}
}
}
我对该解决方案的有限理解是,如果不这样做,事务将在SQL Server端提交,这将导致返回的游标在传递到.NET代码后在其迭代中失败。如果有人有更好的解释,请补充这个问题。这是一个有价值的解决方案
使用(var事务=connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
...
我现在可以做了,这么多tks你的函数是什么样子的?我想这是个问题为什么你有两个不同的数据库标记?@LalitKumarB如果你花点时间阅读这个问题,你就会知道的。@Reniuz,我读了这个问题。我想从OP那里知道他是否确定Oracle或SQL Server中存在的问题。也许,我可以回答他om OP会很好。要求更多的澄清总是好的,然后问他是否确定c#中存在问题。阅读后,我考虑了oracle在链接到sql server之前提交事务的可能性。这就是为什么我要求提供函数内容。很高兴您共享了解决方案-我想知道它可能是什么。