2017-06-07 61 views
0

我們以前有過一個OracleCommand,我們正在添加參數,然後我們會運行ExecuteReaderAsync來獲取OracleDataReader。然後,我們通過調用一個「GetList」方法來填充不同對象的列表,該方法將使讀取器和方法組返回與列表相同類型的對象。如何將類的屬性設置爲匹配類型的方法組列表?

// These parameters need to be in the same order as returned by the procedure. 
command.CommandType = CommandType.StoredProcedure; 
command.Parameters.Add("ProcedureTable1", OracleDbType.RefCursor, ParameterDirection.Output); 
command.Parameters.Add("ProcedureTable2", OracleDbType.RefCursor, ParameterDirection.Output); 
command.Parameters.Add("ProcedureTable3", OracleDbType.RefCursor, ParameterDirection.Output); 

OracleDataReader reader = await command.ExecuteReaderAsync() as OracleDataReader; 

// These methods need to be called in the same order as the parameters above. 
List<Type1> type1s = await GetList(reader, CreateType1, false); // The first item is called with an overload that takes wht 
List<Type2> type2s = await GetList(reader, CreateType2); 
List<Type3> type3s = await GetList(reader, CreateType3); 

這個問題,正如我們所建議的那樣,如果參數發生混亂,我們會得到一個數據庫異常而不是數據。如果對方法組的調用無序排列,則只需填充它們應該包含的類的空白版本即可。

建議使用有序列表,所以我設置了一個Dictionary來保存DataPackage對象,並在數據庫包和方法組中使用該過程的字符串名稱。

我很容易地將它們全部以正確的順序添加一次,並設置命令參數。

// These parameter/method pairs need to be in the same order as returned by the procedure. 
List<DataPackage> orderedList = new List<DataPackage> 
{ 
    new DataPackage<Type1>("Type1ProcedureName", CreateType1MethodGroup, type1List), 
    new DataPackage<Type2>("Type2ProcedureName", CreateType2MethodGroup, type2List), 
    new DataPackage<Type3>("Type3ProcedureName", CreateType3MethodGroup, type1List), 
}; 

command.CommandType = CommandType.StoredProcedure; 
orderedList.ForEach(p => command.Parameters.Add(p.ProcedureName, OracleDbType.RefCursor, ParameterDirection.Output)); 

隨着類

public class DataPackage 
{ 
    public string ProcedureName { get; protected set; } 

    public Func<OracleDataReader, object> MethodGroup { get; protected set; } 

    public virtual void Add(object list) 
    { 
    } 
} 

public class DataPackage<T> : DataPackage 
{ 
    public DataPackage(string procedureName, Func<OracleDataReader, object> methodGroup, List<T> returnedData) 
    { 
     this.ProcedureName = procedureName; 
     this.MethodGroup = methodGroup; 
     this.ReturnedData = returnedData; 
    } 

    public List<T> ReturnedData { get; set; } 

    public override void Add (object list) 
    { 
     List<T> castList = list as List<T>; 

     if (castList != null) 
     { 
      this.ReturnedData.AddRange(castList); 
     } 
    } 
} 

至少它只需以添加一次,而該部分作品。我無法弄清楚的部分是用每個方法組調用GetList來填充數據。

orderedList.ForEach(async v => 
{ 
    v.Add(await GetList(reader, v.MethodGroup, false)); 
}); 

問題是,當我調試Add方法DataPackage名單進來作爲一個對象,它試圖強制轉換爲列表,但失敗了,即使列表參數顯然是一個列表,並填充與數據。 有沒有更好的方法來做到這一點?

回答

0

我正在尋找和發現的問題Cast Object to Generic List和改變了代碼的輸入DataPackage的Add方法

public override void Add (object list) 
    { 
     IEnumerable castList = list as IEnumerable; 

     if (castList != null) 
     { 
      IEnumerable<T> typedList = castList.OfType<T>(); 
      this.ReturnedData.AddRange(typedList); 
     } 
    } 

,它工作正常。

相關問題