2017-09-02 44 views
0

我得到以下行 returnMessage = ((command.Parameters[4].Value);檢索PLSQLAssociativeArray的瓦萊斯在C#

的誤差實際上我的代碼通過各種類型爲List陣列作爲一個參數到Oracle通過使用Oracle存儲過程。鑑於

List<string> AccNo = new List<string>(); 
List<Double> TrnAmt = new List<Double>(); 
List<int> TranNo = new List<int>(); 
List<string> rec = new List<string>(); 

AccNo.Add(data_read3[3].ToString()); 
TrnAmt.Add(Double.Parse(data_read3[0].ToString())); 
TranNo.Add(trnno); 

rec = cn_new.Call_Procedure_Host("Host_to_Host.host_record", AccNo, TrnAmt, 
TranNo, CONNECTION_STRING_other); 

現在Call_Procedure_Host的代碼將返回輸出參數,這也是給

public List<string> Call_Procedure_Host(string a, List<string> b, List<double> c, List<int> d,string cn) 
{ 
    OracleParameter op = null; 
    try 
    { 

     connection.Close(); 
     connection.ConnectionString = cn; 
     connection.Open(); 
     OracleCommand command = connection.CreateCommand(); 
     command.CommandText = a; 
     command.CommandType = CommandType.StoredProcedure; 

     var arry = command.Parameters.Add("Accno", OracleDbType.Varchar2); 
     //op = new OracleParameter("Accno", OracleDbType.Varchar2); 
     arry.Direction = ParameterDirection.Input; 
     arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     arry.Value = b.ToArray(); 
     arry.Size = b.Count(); 
     arry.ArrayBindSize = b.Select(_ => _.Length).ToArray(); 
     arry.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, b.Count()).ToArray(); 
     //op.Value = b; 
     //command.Parameters.Add(op); 


     var arry1 = command.Parameters.Add("Trnamount", OracleDbType.Double); 
     //op = new OracleParameter("Accno", OracleDbType.Varchar2); 
     arry1.Direction = ParameterDirection.Input; 
     arry1.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     arry1.Value = c.ToArray(); 
     arry1.Size = c.Count(); 
     arry1.ArrayBindSize = c.Select(_ => _.ToString().Length).ToArray(); 
     arry1.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, c.Count()).ToArray(); 
     //op.Value = b; 
     //command.Parameters.Add(op); 

     var arry2 = command.Parameters.Add("Trnno", OracleDbType.Int32); 
     //op = new OracleParameter("Accno", OracleDbType.Varchar2); 
     arry2.Direction = ParameterDirection.Input; 
     arry2.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     arry2.Value = d.ToArray(); 
     arry2.Size = d.Count(); 
     arry2.ArrayBindSize = d.Select(_ => _.ToString().Length).ToArray(); 
     arry2.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, d.Count()).ToArray(); 


     var arry3 = command.Parameters.Add("returnMessage", OracleDbType.Varchar2); 
     //op = new OracleParameter("Accno", OracleDbType.Varchar2); 
     arry3.Direction = ParameterDirection.Output; 
     arry3.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

     arry3.Size = d.Count(); 
     arry3.ArrayBindSize = c.Select(_ => _.ToString().Length).ToArray(); 
     arry3.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, d.Count()).ToArray(); 


     int r = command.ExecuteNonQuery(); 
     connection.Close(); 


     List<string> returnMessage = new List<string>(); 
        returnMessage = ((command.Parameters[4].Value);          
     return returnMessage; 


    } 

現在我在網上收到錯誤returnMessage = ((command.Parameters[4].Value);

錯誤CS0266不能隱一個陣列list.The碼將類型「對象」轉換爲「System.Collections.Generic.List」。存在明確的轉換(您是否缺少演員?)

請幫我解決問題。

回答

0

您的代碼無法編譯,因爲command.Parameters[4].Value的編譯時類型爲object

如果您的存儲過程在輸出參數中返回一個PL/SQL關聯字符串數組,那麼ODP.NET將在存儲過程調用完成後將該參數的值設置爲一個C#數組。您需要然後獲取該數組並將其轉換爲List<string>

如果您正在使用Oracle託管數據訪問(Oracle.ManagedDataAccess.dll),則該數組是C#string s的數組。要進入一個List<string>這個,用這個:

string[] returnMessage = (string[])(command.Parameters[4].Value); 
    return returnMessage.ToList(); 

如果使用非管理驅動程序(Oracle.DataAccess.dll),數組回來爲OracleString秒的陣列。獲取串出來,這是可悲的是更多的工作:

OracleString[] returnMessage = (OracleString[])(command.Parameters[4].Value); 
    List<string> strings = returnMessage.Select(os => os.IsNull ? null : os.Value).ToList(); 
    return strings 
+0

我已經使用這個代碼,但仍然得到錯誤 –

+0

無法投類型的對象Oracle.DataAccess.Types.OracleString []'鍵入「System.String [] –

+0

@AhhijitGhosh:對不起,我提供的代碼與託管驅動程序一起工作,但似乎你沒有使用它。我編輯了我的問題,包括如何從「OracleString」數組中讀取字符串,請讓我知道如果這不起作用。 –