使用使用企业库管理的ODP.Net时,使用OUT refcursor执行存储过程时出现问题

问题描述 投票:0回答:1

我正在尝试使用带有Enterprise Library的托管ODP.Net逐个执行多个(3)存储过程。每个存储过程都返回一个OUT游标,每个游标都被命名为“cur_out”。奇怪的是,第一个存储过程总是返回记录,但后续调用ExecuteDataSet()表示剩下的两个SP永远不会返回任何记录。这与System.Data.OracleClient完美配合,所以我知道存储过程没有问题。我无法弄清楚为什么这些SP没有返回任何东西。以下是我的示例代码:

DbCommand cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP1");
                DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM1", param1);
                DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM2", param2);
                if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
                {
                    OracleParameter cur = new OracleParameter("cur_out", 
                                          OracleDbType.RefCursor, 0, 
                                          ParameterDirection.Output, true, 
                                          0, 0, String.Empty, 
                                          DataRowVersion.Current, 
                                          Convert.DBNull);
                    cmd.Parameters.Add(cur);
                }
                DataSet dsSub = DB.ExecuteDataSet(cmd); <--WORKS i.e. returns records

         cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP2");
                DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM1", param1);
                DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM2", param2);
                if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
                {
                    OracleParameter cur = new OracleParameter("cur_out", 
                                          OracleDbType.RefCursor, 0, 
                                          ParameterDirection.Output, true, 
                                          0, 0, String.Empty, 
                                          DataRowVersion.Current, 
                                          Convert.DBNull);
                    cmd.Parameters.Add(cur);
                }
                DataSet dsSub1 = DB.ExecuteDataSet(cmd); <--FAILS i.e. no records returned
               DataTable dt1 = dsSub1.Tables[0];
               dsSub1.Tables.Remove(dt1);
               dt1.TableName = "Ported DataTable 1";//Provide name 
               explicitly to prevent name conflicts with existing datatable
               dsSub.Tables.Add(dt1);

       cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP3");
                DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM1", param1);
                DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM2", param2);
                if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
                {
                    OracleParameter cur = new OracleParameter("cur_out", 
                                          OracleDbType.RefCursor, 0, 
                                          ParameterDirection.Output, true, 
                                          0, 0, String.Empty, 
                                          DataRowVersion.Current, 
                                          Convert.DBNull);
                    cmd.Parameters.Add(cur);
                }
                DataSet dsSub2 = DB.ExecuteDataSet(cmd); <--FAILS i.e. no records returned

                DataTable dt2 = dsSub2.Tables[0];

                dsSub2.Tables.Remove(dt2);
                dt2.TableName = "Ported DataTable 2";//Provide name 
                explicitly to prevent name conflicts with existing datatable
                dsSub.Tables.Add(dt2);

有人能指出我在这里错过了什么吗?有什么我能做的不同吗?请注意,我使用的Oracle 12c DB在单个存储过程中返回多个ref游标有问题,因此必须单独执行这些,然后将结果合并到一个数据集中。

.net oracle enterprise-library odp.net-managed
1个回答
0
投票

我建议宣布一个全新的DbCommand cmd2DbCommand cmd3而不是试图重用最初的DbCommand cmd。过去,我在重用与Oracle参数和连接相关的变量时遇到了很多问题,如果你只是为数据库连接的每个方面使用新变量,很多问题都会消失。

具体来说,对于你的代码,似乎你不断向cmd.添加相同的两个参数但我不认为这是将现有参数中的值重新设置为新值,我认为它是添加另一个,重复,参数集合的参数,这会导致问题。

© www.soinside.com 2019 - 2024. All rights reserved.