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)
提前致谢...
花了一天时间调查这个问题后,我在发布问题后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代码后在迭代中失败.如果有人有更好的解释请加入这个问题.
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |