昨天使用 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);
DataGrid
DataSource=dsCstomers;
DataGrid
DataBind();
結果出現如下問題
ORA
: 第
行
第
列: PLS
: 調用
LISTALLSTATIC_USERS
時參數個數或類型錯誤 ORA
: 第
行
第
列: PL/SQL: Statement ignored
說明: 執行當前 Web 請求期間
出現未處理的異常
請檢查堆棧跟蹤信息
以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息
異常詳細信息: System
Data
OracleClient
OracleException: ORA
: 第
行
第
列: PLS
: 調用
LISTALLSTATIC_USERS
時參數個數或類型錯誤 ORA
: 第
行
第
列: PL/SQL: Statement ignored
源錯誤:
行
行
DataSet dsCustomers = db
ExecuteDataSet(dbCommandWrapper);行
DataGrid
DataSource=dsCustomers;
行
DataGrid
DataBind();
我以為是我的參數沒有弄對
於是就加了一句
dbCommandWrapper
AddOutParameter(
cur_Static_User
DbType
Object
);
結果還是一樣的
後來也試驗了
OracleCommandWrapper
AddParameter(string
DbType
int
ParameterDirection
bool
byte
byte
string
DataRowVersion
object);
這個方法來添加
也是不行
後來就上網找了很長時間也沒有什麼進展
今天早上起來
還是一籌莫展
偶爾的打開Enterprise Library安裝目錄的Enterprise Library Release Notes
rtf文件
發現裡面有這麼一段
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;
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;
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
ParameterDirection
Output
true
String
Empty
DataRowVersion
Default
Convert
DBNull);
dbCommandWrapper
AddParameter(
cur_OUT_g
OracleType
Cursor
ParameterDirection
Output
true
String
Empty
DataRowVersion
Default
Convert
DBNull);
DataSet dsCustomers = db
ExecuteDataSet(dbCommandWrapper);
DataGrid
DataSource=dsCustomers
Tables[
];
DataGrid
DataBind();
DataGrid
DataSource=dsCustomers
Tables[
];
DataGrid
DataBind();
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25559.html