Enterprise Library – Data Block oracle返回 cursor 問題的解決

來源:互聯網
上載者:User

          昨天使用 Data Block 操作 oracle 返回 cursor 。期間產生了一點問題,很是鬱悶,找了一下午也沒有解決。早上睡不著,起來繼續找。結果找到瞭解決的方法。其實也是怪自己沒有很好的看文檔。在此記錄一下。以使別的同志再出現我的問題的時候,很容易的找到解決的方法。

         問題是這樣的:
   我在oracle裡面有這樣一個過程

PROCEDURE ListAllStatic_Users (cur_Static_User OUT T_CURSOR)
    IS
    BEGIN
        OPEN cur_Static_User FOR
        SELECT * FROM Static_User ;
    END ListAllStatic_Users;

我在程式裡面如下調用:

 Database db = DatabaseFactory.CreateDatabase("oraserver");
            string sqlCommand = "Static_UserPackage.ListAllStatic_Users";
            DBCommandWrapper dbCommandWrapper =db.GetStoredProcCommandWrapper(sqlCommand);
                         DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);
            DataGrid1.DataSource=dsCstomers;
            DataGrid1.DataBind();

結果出現如下問題:

ORA-06550: 第 1 行, 第 7 列: PLS-00306: 調用 'LISTALLSTATIC_USERS' 時參數個數或類型錯誤 ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored

說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。

異常詳細資料: System.Data.OracleClient.OracleException: ORA-06550: 第 1 行, 第 7 列: PLS-00306: 調用 'LISTALLSTATIC_USERS' 時參數個數或類型錯誤 ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored

源錯誤:

行 44: 行 45:  DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);
行 46: DataGrid1.DataSource=dsCustomers;行 47: DataGrid1.DataBind();


我以為是我的參數沒有弄對,於是就加了一句:

dbCommandWrapper.AddOutParameter("cur_Static_User",DbType.Object,500);

結果還是一樣的。後來也實驗了

OracleCommandWrapper.AddParameter(string,DbType,int,ParameterDirection,bool,byte,byte,string,DataRowVersion,object);

這個方法來添加,也是不行。

後來就上網找了很長時間也沒有什麼進展。今天早上起來,還是一籌莫展,偶爾的開啟Enterprise Library安裝目錄的Enterprise Library Release Notes.rtf檔案,發現裡面有這麼一段
 

2.4 Data Access Application Block: Default Oracle cursor cur_OUT

The managed provider for Oracle requires you to explicitly bind your reference cursor in your parameter collection. This means you must explicitly create an output parameter for the cursor in your application code. However, that code will not be portable with database systems that do not require a parameter for the cursor. The OracleDatabase allows you to create commands without specifying a cursor. It will create a cursor, named cur_OUT, for commands that execute a stored procedure and do not include an output parameter for the cursor. This means that you can name your reference cursor as "cur_OUT" and the Data Access Application Block will bind it for you; you do not need to explicitly create an output parameter for the cursor. If your stored procedures use a cursor with a name other than "cur_OUT," you must explicitly add a parameter for each cursor to the command. Similarly, if your stored procedure contains multiple cursors, you must explicitly add each cursor parameter to the command.
這下我就明白了。在我的oracle函數中,我的名字 cur_Static_User 和預設的名字cur_OUT不匹配。

於是我就改了我的預存程序的參數名稱,cur_Static_User改為 cur_OUT。

問題就解決了。

經過實驗,也可以用如下方法用自己的參數名,而不用預設的參數名。
也可以,在一個
PROCEDURE中返回多個 CURSOR

我的預存程序:

  Procedure STATIC_USER_SelectAll 
 ( cur_OUT_f OUT T_OUT, cur_OUT_g OUT T_OUT) 
 AS 
 Begin 
 OPEN cur_OUT_f FOR Select * from STATIC_USER; 
 OPEN cur_OUT_g FOR Select * from STATIC_ROLE;
 End; 

代碼如下:

Database db = DatabaseFactory.CreateDatabase("oraserver");
string sqlCommand = "Static_UserPackage.STATIC_USER_SelectAll";
Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleCommandWrapper dbCommandWrapper =(Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleCommandWrapper)db.GetStoredProcCommandWrapper(sqlCommand);
dbCommandWrapper.AddParameter("cur_OUT_f", OracleType.Cursor, 0, ParameterDirection.Output, true, 0, 0, String.Empty, DataRowVersion.Default, Convert.DBNull);
dbCommandWrapper.AddParameter("cur_OUT_g", OracleType.Cursor, 0, ParameterDirection.Output, true, 0, 0, String.Empty, DataRowVersion.Default, Convert.DBNull);
DataSet dsCustomers = db.ExecuteDataSet(dbCommandWrapper);
DataGrid1.DataSource=dsCustomers.Tables[0];
DataGrid1.DataBind();
DataGrid2.DataSource=dsCustomers.Tables[1];
DataGrid2.DataBind();

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.