错误 "fetch out of sequence" 从 C# 中的 Oracle 函数返回 table,其中函数使用 dblink 到 SQL 服务器
Error "fetch out of sequence" returning table from Oracle function in C# where function uses dblink to SQL Server
在 C# 代码中,我试图从 Oracle 函数加载数据 table。该函数具有 SYS_REFCURSOR
return 类型。这是我的代码,它尝试使用以下函数填充 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 上。
我们正在使用 .NET 的 Oracle 数据提供程序 - 这可能不支持到 SQL 服务器的数据库链接吗?或者如果是这样,我可以在 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 服务器端提交,这会导致返回的游标在传递给 .NET 代码后的迭代中失败。如果有人有更好的解释,请添加到这个问题中。
这是有价值的解决方案
使用 (var transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
...
我现在可以做到了,非常感谢
在 C# 代码中,我试图从 Oracle 函数加载数据 table。该函数具有 SYS_REFCURSOR
return 类型。这是我的代码,它尝试使用以下函数填充 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 上。
我们正在使用 .NET 的 Oracle 数据提供程序 - 这可能不支持到 SQL 服务器的数据库链接吗?或者如果是这样,我可以在 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 服务器端提交,这会导致返回的游标在传递给 .NET 代码后的迭代中失败。如果有人有更好的解释,请添加到这个问题中。
这是有价值的解决方案 使用 (var transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)) { ... 我现在可以做到了,非常感谢