2011-02-07 49 views
4

假設我有根據我DataAdapter的結果代碼(僞)我可以填寫使用DataAdapter C#列表

class SomeClass 
{ 
    class Person 
    { 
     public static string Name { get; set; } 
     public static int Age { get; set; } 
    } 

    List<Person> person = new List<person>; 

    public void SelectPerson() 
    { 
     DataTable dt = new DataTable(); 

     SqlConnection conn = GetConnection(); 
     conn.Open(); 

     SqlDataAdapter da = new SqlDataAdapter("SELECT name, age FROM person", conn); 
     da.Fill(dt); 
    } 
} 

我可以填充列表(人)? 我該怎麼做?或者有任何解決方法?謝謝...

+0

Pwninstein提出一個有趣的問題。爲什麼人的名字和年齡是靜態的? – 2011-02-07 04:37:15

回答

9

也許最好的辦法是不要讀入一個DataTable第一:

var dr = new DataReader(....) // Fill in what is needed, can't remember offhand 
while(dr.Next()) 
{ 
    persons.Add(
     new Person() { 
      Name = (string) r["Name"], 
      Age = (int) r["Age"] 
     } 
    ); 
} 

警告:您想快速關閉DataReader /連接,不要做很多處理。上面的代碼比使用DataTable作爲中介更有效。

但是,如果你想先使用一個數據表,你可以使用LINQ:

var list = dt.AsEnumerable().Select(r => new Person() { 
    Name = (string) r["Name"], 
    Age = (int) r["Age"] } 
).ToList() 

或只是itterate dt.Rows,並創建新的聯繫人,並將其添加到列表中

您還應該在connection and reader附近使用Using() statements

+0

儘管linq版本不工作......數據表沒有`dt.Rows.Select` – yonan2236 2011-02-07 14:59:20

+0

對不起,使用dt.AsEnumerable(),我並不特別熟悉dr.Row集合。帖子已修復 – 2011-02-09 04:14:09

+0

工作原理 - >除了真正處理空值,或者您無法將類型爲「System.DBNull」的對象轉換爲鍵入「System.String」,但我意識到這不是爲您處理錯誤的答案:) – 2015-07-31 22:36:42

1

是的,你可以。遍歷dt.Rows中的項目並將它們手動轉換爲Person對象。

2

首先,你想使你的姓名和年齡字段的非靜態的(所以類的每個實例都會有自己的價值觀這些屬性

然後,你可以做這樣的事情:

foreach(DataRow row in dt.Rows){ 
    Person p = new Person(){ 
     Name = Convert.ToString(row["name"]), 
     Age = Convert.ToInt32(row["age"]) 
    } 
    person.Add(p); 
} 

希望這有助於

2

還有Linq to DataSet,你可以用它來做些什麼沿着這些線路

var list = (from tr in dt.AsEnumerable() 
    select new Person() { 
     Name = tr.Field<string>("Name"), 
     Age = tr.Field<int>("Age") 
    }).ToList(); 

羅伯特打我的回答,只是用稍微不同的語法。

2

除了其他選項呈現,直到需要用產量,你可以推遲執行:

public static IEnumerable<Person> GetPeople() 
{ 
    using(var conn = GetConnection()) 
    { 
     conn.Open(); 
     string sql = "SELECT name, age FROM person"; 
     var cmd = new SqlCommand(sql, conn); 

     using(SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
      if(rdr == null) 
      { 
       throw new NullReferenceException("No People Available."); 
      } 
      while(rdr.Read()) 
      { 
       var person = new Person(); 
       person.Name = rdr["name"].ToString(); 
       person.Age = Convert.ToInt32 (rdr["age"]); 

       yield return person; 
      }   
     } 
    } 
} 
-2

用戶最近問我一個問題,在.NET 2.0中一個DataTable轉換成一個列表<> 。下面的代碼可以這樣做:

C#

// Assuming there is a DataTable called dt 

List<DataRow> drlist = new List<DataRow>(); 

foreach (DataRow row in dt.Rows) 
{ 
    drlist.Add((DataRow)row); 
}