C#中將DataTable型別轉化為泛型集合

嚴文文-Chris發表於2017-12-09

DataTable是什麼?

DataTable 是一個臨時儲存資料的網格虛擬表(表示記憶體中資料的一個表。)。DataTable是ADO dot net庫中的核心物件。它可以被應用在 VB 和 ASP 上。它無須程式碼就可以簡單的繫結資料庫。它具有微軟風格的使用者介面。

 

注意!!!

當訪問DataTable物件時,請注意它們是按條件區分大小寫的。例如,如果一個DataTable被命名為“mydatatable”,另一個被命名為“Mydatatable”,則用於搜尋其中一個表的字串被認為是區分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認為該搜尋字串不區分大小寫。一個DataSet可以包含數個DataTable物件,它們具有相同的TableName屬性值和不同的Namespace屬性值。有關使用DataTable物件的更多資訊。

 

 

DataTable的作用是什麼?

 

在機房重構的時候我們都會將資料庫的資料讀取出來,經常使用的是就是DataTable資料型別,將資料庫中表的資訊讀取出來,存在臨時資料表中,即DataTable表,然後將在其他層中需要資料傳參的就直接將方法定義為DataTable型別的(除非有特殊要求)。而另一種儲存資料的方式就泛型集合,將DataTable轉換成泛型,然後通過泛型再去傳遞資料。

       

       DataTable的資料改動需要根據資料庫表中的資訊操作,例如,如果我想將資料庫某表的某個新欄位讀取出來,那麼用DataTable需要重新檢視資料庫,然後間接就將資料庫中的資訊暴露了,除非是同一個人操作,不過那樣不靈活了。

 

泛型是什麼?

       泛型是具有佔位符(型別引數)的類、結構、介面和方 法,這些佔位      符是類、結構、介面和方法儲存或者使用的一個或多個型別的佔位符。

 

泛型集合類可以將型別引數用作它所儲存的物件的型別的佔位符;型別引數作為其欄位的型別或其方法的引數型別出現。泛型的方法還可以將引數型別用作返回值型別或者某個形參的型別。

     

泛型集合其實就是一個個的實體類集合,我們在沒有接觸這個概念前,資料庫訪問返回的型別有實體、DataTable、Boolean。下面是畫了幾張示意圖:

 

 

 

 

 

使用泛型的好處?

如果不用泛型集合,你要是查詢有多少個使用者的時候(新增刪除使用者),單個實體和Boolean肯定是不行的,DataTable倒是可以,但是它因為高耦合(一個使用者資訊變化,就得修改DataTable),使系統執行的效能會不好.

 

 

 

 

如何DataTable型別轉化為泛型集合?

  public List<T>ConvertToList<T>(DataTable dt) where T : new()

        {

            //初始化,獲得型別,string型別變數

            List<T> ts = newList<T>();

            //獲得此型別的模型

            Type type = typeof(T);

            String tempName = "";

 

            foreach (DataRow dr in dt.Rows)

            {

                T t = new T();

                //獲得此模型的公共屬性

                PropertyInfo[] propertys =t.GetType().GetProperties();

                //foreach(型別 要用的變數名稱 in之前宣告的變數名稱)

                foreach (PropertyInfo pi inpropertys)

                {

                    tempName = pi.Name;

                    //檢查DataTable是否包含此列

                    if(dt.Columns.Contains(tempName))

                    {

                        // 判斷此屬性是否有Setter

                        if (!pi.CanWrite)continue;

                        object value =dr[tempName];

                        if (value !=DBNull.Value)

                            pi.SetValue(t,value, null);

                    }

                }

                ts.Add(t);

            }

 

            return ts;

        }

 

 

但是沒理解他們到底有什麼不同,及時不用泛型,我也可以將資料來源存到DataTable,然後方法返回值也定義為DataTable型,請高手指點!

相關文章