从C#中的Oracle函数返回错误"fetch out of sequence",其中function使用dblink to SQL Server

get*_*ode 3 c# sql-server oracle

在C#代码中,我正在尝试从Oracle函数加载数据表.该函数具有SYS_REFCURSOR返回类型.这是我尝试DataTable 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,Oracle函数使用dblink连接SQL数据库.在那些情况下,我得到以下例外......

ORA-01002: fetch out of sequence
ORA-02063: preceding line from GATE_LINK
Run Code Online (Sandbox Code Playgroud)

... GATE_LINKdblink 在哪里.到目前为止,我的研究证实,问题必须在于dblink.

我们正在使用Oracle数据提供程序用于.NET - 它是否可能不支持dblink到SQL Server?或者如果是,我可以在SQL端配置什么来解决这个问题?

我应该提一下,我们通过VPN连接到Oracle DB,连接字符串使用以下格式:

"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})));User Id={3};Password={4};"
Run Code Online (Sandbox Code Playgroud)

提前致谢...

get*_*ode 6

花了一天时间调查这个问题后,我在发布问题后10分钟就找到了答案.典型!

答案在这里找到 - https://community.oracle.com/thread/659625 - 所需要的只是将调用代码包装在一个事务中.工作代码如下所示:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我对该解决方案的有限理解是,如果没有这个,就会在SQL Server端提交一个事务,这会导致返回的游标在传递给.NET代码后在迭代中失败.如果有人有更好的解释请加入这个问题.