2012-03-28 4 views
3

私は、「ORA-01036を:不正な変数名/番号」を取得の下のExecuteReaderの呼び出しに:DotConnectコンポーネントを使用して結果セットを取得しようとすると、エラーが発生するのはなぜですか?コード付き

cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor); 
cmd.Parameters["cur"].Direction = ParameterDirection.Output; 
Devart.Data.Oracle.OracleCursor oraCursor = 
    (Devart.Data.Oracle.OracleCursor)cmd.Parameters["cur"].Value; 
Devart.Data.Oracle.OracleDataReader odr = cmd.ExecuteReader(); 
while (odr.Read()) { 
    ACurrentUserRoles.Add(odr.GetString(0)); 
} 

私が何をしたいのかは、クエリの結果をリストに移入されます。私はDevArtのドキュメント(またはグーグル)の例は見ていません。

OracleDataReader odr = cmd.ExecuteReader(); 
while (odr.Read()) 
{ 
    ACurrentUserRoles.Add(odr.GetString(0)); 
} 

... OracleのODPコンポーネントを使用していましたが、DotConnectコンポーネントとの並列処理が見つかりませんでした。

更新日:

さて、ここで(ACurrentUserRolesは、文字列のリストである)全体の方法です:

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("ABCID", _ABCID); 
    cmd.Parameters["ABCID"].Direction = ParameterDirection.Input; 
    cmd.Parameters["ABCID"].DbType = DbType.String; 
    cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor); 
    cmd.Parameters["cur"].Direction = ParameterDirection.Output; 
    //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)); 
    } 
} 

私は取得していますERRのMSGのは、彼らが発生した行にコメントとして追加されます。

答えて

1

まず、カーソルタイプのパラメータを追加して、それを完全に無視するのはなぜですか?
第2に、このようなExecuteReaderではなくExecuteNonQueryでのカーソルの使用は見たことがありません。例えば

string cmdText = "begin open :cur for select * from dept; end;"; 
OracleCommand oraCommand = new OracleCommand(cmdText, oraConnection); 
oraCommand.Parameters.Add("cur", OracleDbType.Cursor); 
oraCommand.Parameters["cur"].Direction = ParameterDirection.Output; 
oraCommand.ExecuteNonQuery(); 
OracleCursor oraCursor = (OracleCursor)oraCommand.Parameters["cur"].Value; 
oraDataAdapter.Fill(dataSet, "Table", oraCursor); 

だから、おそらくあなたの例外はExecuteReaderの

の使用から派生これはDevArtのサイトから直接撮影した別の例である:

string cmdText = "begin open :cur1 for select * from dept;" + 
    "open :cur2 for select * from emp; end;"; 
OracleCommand oraCommand = new OracleCommand(cmdText, oraConnection); 
oraCommand.Parameters.Add("cur1", OracleDbType.Cursor); 
oraCommand.Parameters["cur1"].Direction = ParameterDirection.Output; 
oraCommand.Parameters.Add("cur2", OracleDbType.Cursor); 
oraCommand.Parameters["cur2"].Direction = ParameterDirection.Output; 
oraDataAdapter.SelectCommand = oraCommand; 
oraDataAdapter.Fill(dataSet); 
+0

しかし、それはAでありクエリ、なぜ私はExecuteNonQuery()を使用するでしょうか? Insert、Update、Deleteステートメントのように聞こえます。これは、1..Nレコードを返すSelectです。 –

+0

また、クエリの結果をリストに追加したいので、それをリーダでループしたいのです。上記の最初の例では、 "dataSet"はどこからでも出てきます - グリッドを埋めるのですか? –

+0

次に、質問のテキストを表示してください。カーソルが不要な場合は、パラメータから削除するか、2番目の例を使用します。 – Steve

関連する問題