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

标签 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);
        }
    }
}

在某些情况下,Oracle 函数使用到 SQL 数据库的 dblink。在那些情况下,我得到以下异常......

ORA-01002: fetch out of sequence
ORA-02063: preceding line from GATE_LINK

... GATE_LINK 是数据库链接。到目前为止,我的研究证实问题一定出在 dblink 上。

我们正在使用 Oracle Data Provider for .NET - 这可能不支持到 SQL Server 的 dblink 吗?或者如果是,我可以在 SQL 端配置什么来解决这个问题?

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

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

提前致谢...

最佳答案

我花了一天多的时间调查这个问题,在发布我的问题后仅 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);
            }
        }
    }
}

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

关于c# - 错误 "fetch out of sequence"从 C# 中的 Oracle 函数返回表,其中函数使用 dblink 到 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862878/

相关文章:

c# - System.Data.SqlClient.SqlException : Cannot insert the value NULL into column 'IngredientId' , 表 'RecipeApplicationDb.dbo.IngredientModels' ;

c# - ClickOnce,我的应用程序崩溃 Visual C# Express

c# - 哈希表与字典

SQL 查询以显示已购买某些特定产品的客户姓名

sql-server - SQL 服务器 : case multiple operations in then part

oracle - oracle数据库中不区分大小写的唯一约束

c# - `Select` 元素的顺序是否不同?

c# - 在大表上搜索文本的最有效方法是什么?

sql - 使用 OLEDB select 语句获取错误值

xml - 如何在 XML 林中创建带有属性的可选 XML 标签