OK、リストに保存するためにカーソル/結果セットをループしている問題を解決する方法を誰も知らないようです。だから、まず第一に:
この方法で SQL パラメータを OracleCommand オブジェクトに追加します (正常に動作します)。
cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;
IOW、パラメーターを追加するときに、SQL のパラメーター化された部分の名前 (上記の「ABCID」) とそれに値を渡します (_ABCID は、割り当てられた変数です。たとえば、「42」とします)。
ただし、カーソル (出力) パラメーターを追加するときは、値 (初期化されたカーソル オブジェクトなど) ではなく、単にデータ型が必要なようです。
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
(私は両方の方法を試しましたが、どちらもうまくいかなかったので...?)
本当に/したがって、私の質問は次のとおりです。これは、Cursorパラメーターをトラバーサル/アクセスのために出力することを宣言する本当に正しい方法ですか?
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));
}
}