2015-11-05 50 views
0

我有一個滿表的字符串我需要將它轉換爲帶有類型的通用對象列表。我到目前爲止。將SQL數據轉換爲通用列表

private List<T> ConvertDataToObject<T>(object oClass, string sSQL) 
{ 
    List<T> lReturn = new List<T>(); 
    SqlConnection sqlCon = new SqlConnection(sqlConnString); 
    SqlCommand sqlCom = new SqlCommand(sSQL.ToString()); 
    sqlCom.Connection = sqlCon; 
    try 
    { 
     sqlCon.Open(); 
     SqlDataReader sqlDR = sqlCom.ExecuteReader(); 
     while (sqlDR.Read()) 
     { 
      foreach (var prop in oClass.GetType().GetProperties()) 
      { 
       if (prop.Name == sqlDR[prop.Name]) 
       { 
        prop.SetValue(oClass, Convert.ChangeType(sqlDR[prop.Name].ToString().Trim().Replace("'", "''"), prop.PropertyType), null); 
       } 
      } 
     } 
    } 
    catch 
    { } 
    finally 
    { sqlCon.Close(); } 

    return lReturn; 
} 

我不認爲這是正確的: 1:我需要填寫與對象名單,我不知道我怎麼想這樣做 2:我不知道的是,2路是填寫對象的最佳方式。

+0

這可能會幫助: http://developmentpassion.blogspot.com/2015/09/implementing-repository- pattern-and.html –

回答

1

我寫過一個類來將數據庫查詢結果映射到過去的對象。在這個實現中唯一的「陷阱」是SQL列名稱需要匹配類的屬性名稱。

這裏是類:

public class DataObjectMapper<T> where T : new() 
{ 
    public List<T> MapResultsToObject(IDataReader reader) 
    { 
     List<T> objects = new List<T>(); 

     while (reader.Read()) 
     { 
      objects.Add(MapRow(reader)); 
     } 

     return objects; 
    } 

    private T MapRow(IDataReader reader) 
    { 
     T item = new T(); 

     var typeProperties = typeof(T).GetProperties(); 

     foreach (var property in typeProperties) 
     { 
      int ordinal = reader.GetOrdinal(property.Name); 

      if (!reader.IsDBNull(ordinal)) 
      { 
       property.SetValue(item, reader[ordinal].ToString(), null); 
      } 
     } 

     return item; 
    } 
} 

下面是如何使用它

DataObjectMapper<T> resultsMapper = new DataObjectMapper<T>(); 

    SqlDataReader reader = command.ExecuteReader(); 

    List<T> results = resultsMapper.MapResultsToObject(reader); 
+0

這看起來像它會工作,但我得到一個錯誤「'T'必須是一個非抽象類型與公共無參數構造函數爲了使用它作爲泛型類型或方法中的參數'T' –

+0

其工作感謝: 私人列表 ConvertDataToObject (object oClass,string sSQL)where T:new() –