簡體   English   中英

使用由企業庫管理的ODP.Net時,使用OUT refcursor執行存儲過程的問題

[英]Issue with executing stored procedure with an OUT refcursor when using ODP.Net managed with Enterprise library

我正在嘗試使用托管的ODP.NetEnterprise Library來一對一地執行多個(3)存儲過程。 每個存儲過程都返回一個OUT游標 ,每個游標都被命名為“ cur_out ”。 奇怪的是,第一個存儲過程總是返回記錄,但是隨后為其余兩個SP調用ExecuteDataSet()卻從不返回任何記錄。 這與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游標存在問題,因此必須分別執行這些游標,然后將結果合並到單個數據集中。

我建議聲明一個全新的DbCommand cmd2DbCommand cmd3而不要嘗試重用初始的DbCommand cmd 過去,在重用與Oracle參數和連接相關的變量時,我遇到了很多問題,如果僅對數據庫連接的每個方面都使用新變量,那么很多問題就會消失。

具體來說,對於您的代碼,似乎正在不斷向cmd.添加相同的兩個參數cmd. 但是我不認為這會將現有參數中的值重新設置為新值,我認為這是在參數集合中添加另一個重復的參數,這會引起問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM