2017-09-02 43 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”数组中读取字符串,请让我知道如果这不起作用。 –