Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“错误”;取出顺序错误“;从C#中的Oracle函数返回表,其中函数使用数据库链接到SQL Server_C#_Sql Server_Oracle - Fatal编程技术网

“错误”;取出顺序错误“;从C#中的Oracle函数返回表,其中函数使用数据库链接到SQL Server

“错误”;取出顺序错误“;从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;

在C代码中,我试图从Oracle函数加载数据表。该函数具有
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之前提交事务的可能性。这就是为什么我要求提供函数内容。很高兴您共享了解决方案-我想知道它可能是什么。