2016-10-27 20 views
2

配列をOracleプロシージャに渡そうとしています。私はそれについて検索し、最初に私は 'dizi'(ここではenter link description hereのような)という名前のタイプを作成しました。したがって、Oracleの開発者で動作します。問題は;私はパラメータとしてプロシージャに私のC#の配列を渡すことはできません。だから私の手続きに配列を渡すことはできますか? (私は実行すると、Oracleエラーが言う、:すべての変数がバインド)ここで配列をOracleプロシージャに渡すC#

が私のコードである

public void InsertQuestion(List<string> area_list) 
{ 
    quest_areas = area_list.ToArray(); 
    command.Connection = connect; 
    connect.Open(); 

    var arry = command.Parameters.Add("Areas", OracleDbType.Varchar2); 
    arry.Direction = ParameterDirection.Input; 
    arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
    arry.Value = quest_areas; 


    command.CommandText ="TESTPROCEDURE(:Areas)"; 
    command.CommandType = CommandType.StoredProcedure; 
    command.ExecuteNonQuery(); 
    connect.Close(); 
} 
+0

'DbParameter'を内部的に' OracleParameter'に追加して 'command.Parameters.Add'を実行しています –

+0

しかし動作しませんか? –

+0

ODP.Netのサンプルを確認できますか? –

答えて

1
  1. 配列型と手順を定義します

    CREATE or replace PACKAGE Testpackage AS 
        TYPE Areas_t is table of VARCHAR(100) index by BINARY_INTEGER; 
        PROCEDURE TESTPROCEDURE(Areas IN Areas_t);  
    END Testpackage; 
    
  2. C#のルーチンを:

    public void InsertQuestion(IEnumerable<string> area_list) 
    { 
        var connect = new OracleConnection("YOUR CONNECTION STRING"); 
    
        var command = new OracleCommand("BEGIN Testpackage.Testprocedure(:Areas); END;", connect); 
    
        connect.Open(); 
    
        var arry = command.Parameters.Add("Areas", OracleDbType.Varchar2); 
    
        arry.Direction = ParameterDirection.Input; 
        arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
        arry.Value = area_list.ToArray(); 
        arry.Size = area_list.Count(); 
        arry.ArrayBindSize = area_list.Select(_ => _.Length).ToArray(); 
        arry.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, area_list.Count()).ToArray(); 
    
        command.ExecuteNonQuery(); 
    
        connect.Close(); 
    } 
    
関連する問題