好吧,似乎沒有人知道如何解決我通過遊標/結果集循環訪問存儲到列表中的問題,所以我打算將它分解成幾部分,並試圖通過這種方式來琢磨。所以,首先:是否真的要將遊標參數聲明爲與「常規」參數不同?
我添加SQL參數到OracleCommand對象這種方式(正常工作):
cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;
督察,當我添加帕拉姆,我傳遞的參數化部分的名稱SQL(上面的「ABCID」)和賦予它的值(_ABCID是已分配的變量,比方說,「42」)。
然而,添加一個光標(輸出)PARAM時,它似乎想,而不是一個值(如初始化的光標對象),而是簡單的數據類型:
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
(我嘗試這兩種方式,並且都沒有工作,所以...?)
實際上/因此,我的問題是:這真的是正確的方式來聲明一個光標參數輸出回遍歷/訪問?
我使用DevArt DotConnect組件的全新版本(6.80.332),VS 2010,.NET 4
更新時間:
下面是更多的上下文代碼:
public void PopulateCurrentUserRoles(String AUserName, List<String> ACurrentUserRoles) {
_UserName = AUserName;
String query = "select roleid from ABCrole where ABCid = :ABCID";
Devart.Data.Oracle.OracleCommand cmd = new Devart.Data.Oracle.OracleCommand(query, con);
cmd.CommandType = CommandType.Text;
int _ABCID = GetABCIDForUserName();
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;
//cmd.ExecuteNonQuery(); blows up: "illegal variable name/number"
//cmd.ExecuteCursor(); " "
//cmd.ExecuteReader(); " "
Devart.Data.Oracle.OracleCursor oraCursor =
(Devart.Data.Oracle.OracleCursor)cmd.Parameters["cur"].Value;
Devart.Data.Oracle.OracleDataReader odr = oraCursor.GetDataReader(); // "Object reference not set to an instance of an object"
while (odr.Read()) {
ACurrentUserRoles.Add(odr.GetString(0));
}
}
你爲什麼使用遊標?遊標是(通常)在SQL中可以做的最糟糕的事情?我建議在SQL AND/OR中使用WHILE循環重新查看。請記住,SQL是基於SET的邏輯,而不是程序性的。如果你循環繁瑣,那麼你應該在你的代碼中這樣做,而不是SQL – 2012-03-29 17:28:48
「沒有人工作」並不能真正解釋你在嘗試時觀察到的內容...... – 2012-03-29 17:29:37
@Jon:如果我調用ExecuteNonQuery() - 這似乎是共識,雖然它對我來說沒有意義,因爲我的SQL語句是查詢(Select) - 我得到「非法變量名稱/數字」。我調用GetDataReader() – 2012-03-29 18:58:19