2011-06-20 75 views
3

私のシナリオ「値が予想される範囲内に収まっていない」、と私は、配列を渡ししようとしていますこのような手順...のパラメータとして:Oracle.DataAccess(ODP.NET)配列バインド</p> <p>私はC#3.5でのODP.NETのOracleプロバイダを使用してい

var paramNames = new OracleParameter(); 
paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
paramNames.ParameterName = "P_JOB_TITLE"; 
paramNames.Size = 2; 
paramNames.Value = new string[2]{ "name1", "name1" }; 
cmd.Parameters.Add(paramNames); 

ランタイムコードがparamNames.Value =新しい文字列[2] { "NAME1"、 "NAME1"}になると、それは誰もがそれを修正することができ

を「値が予想される範囲内に収まっていません」このエラー

でキャッチ?

ADDITIONAL INFO

指定OracleDbTypeのエラーが固定されているが、「システムを入力するために '[]可能System.String' タイプのオブジェクトをキャストすること

paramNames.OracleDbType = OracleDbType.Varchar2; 

」ができません。私にいくつかのエラーを与えて実行します.IConvertible '。 "

私の目標は、この

http://aspalliance.com/621_Using_ODPNET_to_Insert_Multiple_Rows_within_a_Single_Round_Trip.3

OUTパラメータを持つ別の問題

とき、それが正しく満たされている。この

  paramNames = new OracleParameter(); 
      paramNames.ParameterName = "O_JOB_ID"; 
      paramNames.Size = 3; 
      paramNames.Direction = ParameterDirection.Output; 
      paramNames.OracleDbType = OracleDbType.Int32; 
      paramNames.Value = new int[3] { 0, 0, 0 }; ; 
      cmd.Parameters.Add(paramNames); 

などのアウトパラメータを挿入するような何かをすることですExecuteNonQueryが終了しました。たとえば、pls-sqlプロシージャは3つの挿入を実行し、各配列レコードのrow-idを返します。

が、私は何かが2列目をisnerting例えば、うまくいかない、全体OUTパラメータ(配列)は常に0に設定されている私は期待少なくとも.VALUEが

おかげ

を増強された[0]のparams

答えて

5

配列バインド {配列を複数回実行するために配列をパラメタにバインドするだけです - これはあなたが提供したリンクの例です} アソシエート配列 { PLSQLAssociativeArrayにTABLE OFのINPUTパラメータを指定します。あなたが実行している、私はあなたがこのような何かをやっていると仮定していますあなたのパッケージは/ procを投稿していなかったので

procedure insertdata(P_JOB_TITLE IN VARCHAR2) as 
begin 
insert into myTable(x) value (P_JOB_TITLE); 
end insertdata; 

は次のようにこれを実行するには(ちょうど仮定を検証するために、これを下に置きます)あなたが使用する必要がある記事の著者ArrayBindCount (check out this link, it also has an example)。 これは、複数のパラメータがある場合は、それぞれにARRAYが必要であることも示しています。さて、これはあなたがplSQLAssociativeArrayの例えば

//this was missing in your example and MUST be there to tell ODP how many array elements to expect 
cmd.ArrayBindCount = 2; 

string[] jobTitleArray = {"name1", "name1"}; 

OracleParameter paramNames= new OracleParameter("P_JOB_TITLE", OracleDbType.Varchar2); 

    //paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;/*once again, you are passing in an array of values to be executed and not a pl-sql table*/ 

    //paramNames.Size = 2; /* this is unnecessary since it is for a plsql-associative array*/ 
    paramNames.Value = jobTitleArray ; 
    cmd.Parameters.Add(paramNames); 

に渡すすべてP_JOB_TITLE()のために実行したのは

あなたは、@%ORA_HOME%\ ODP ODPのインストール時に提供されているサンプルを見てみましょう.NETのサンプル\ \ 2.xの\(あなたが提供されたリンクからなど)AssocArray

と配列バインドの例については、 %ORA_HOME%\ odp.net \サンプル\ 2.xの\ ArrayBind

+0

OK男目@ anks私はそれを修正しました.....しかし、私は別の問題を抱えています...私は配列としてOUTパラメータを導入し、シャルムのように動作しますが、PLSQLプロシージャが正常に終了したときにのみ動作します。配列のループ中に何かがうまくいかない場合、すべてのOUT配列パラメータがリセットされます – user756037

+0

@ user756037実行されているpl/sqlブロックで例外処理を行っていますか?例外をバブルアップしないようにして、キャプチャして処理することができます(または少なくとも配列内の他のアイテムを中断させる必要はありません)。 – Harrison

+0

私はcmd.ExecuteNonQuery()を呼び出します。 try {} catch {}文で、最後に{} iでパラメータをチェックします。 – user756037

関連する問題