來介紹與比較datatable、dataset、dataView這三個元件,這三個都能放入資料表操作資料,簡單地說:
datatable是單純用一個變數暫時儲存資料表承接/傳出/收回資料,而dataset可以同時存放多個資料表。
DataView這個元件是拿來檢示dataTable用的元件,最常見的用途就是拿來排序
,就它當作是SQL的View表那樣想就好



我查詢看到的DataTable條目是這樣的:
DataTable 表示記憶體中關聯式資料的某個資料表,它可以單獨建立及使用,也可以由其他.NET Framework 物件所使用,而它最常見用法是做為DataSet 的成員。

一般如果只要回傳一個資料表會比較傾向用Datatable,如果要針對dataTable的資料做運算(例如資料表合併運算),或者回傳多個資料表,就會用到DataSet,由於DataSet會佔用資料表與記憶體,如果資料太多將會拖慢效能,使用時要留意這點


以下是相關程式的介紹:
1、Datatable接資料:
這裡宣告一個DataRow的物件建欄位後再塞值,最後讀出相關值
//--------------使用DataTable的版本----------------------------
query = "select top 1 * from [twg_App2].[dbo].[UserStoreProduct] ";
SqlCommand cmd1 = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
System.Data.DataTable dt1 = null;
System.Data.DataRow dr;
dt1 = new System.Data.DataTable();
dt1.Columns.Add("PID", typeof(int));
dt1.Columns.Add("P_Name", typeof(String));
dt1.Columns.Add("Money", typeof(int));
dt1.Columns.Add("State", typeof(Boolean));
dr = dt1.NewRow();//dt1宣告欄位
da1.Fill(dt1);
dr["PID"] = dt1.Rows[0]["PID"];
dr["P_Name"] = dt1.Rows[0]["P_Name"];
dr["Money"] = dt1.Rows[0]["Money"];
dr["State"] = dt1.Rows[0]["State"];
Response.Write("<br/>DataTable--count:--" + dt1.Rows.Count);
Response.Write("<br/>DataTable--P_NAME--" + dt1.Rows[0]["P_Name"]);
dt1.Rows.Add(dr);
dt1.Dispose();

conn.Close();
da1.Dispose();
//-----------------------------------------------------------
2、使用DataSet接資料:
可以看到這裡的寫法,少了藍色宣告欄位的部份,名稱也略有不同,可以比較一下兩者。
上述同樣功能如果改用DataSet可以三行結束,然而回傳格式一般是透過DataTable達成的,一般而言程式很常遇到修改DataTable裡面的資料,如果要排序就會用到DataSet。
//--------------使用DataSet的版本----------------------------
query = "select * from [twg_App2].[dbo].[UserStoreProduct] ";
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
System.Data.DataSet ds = null;
ds = new System.Data.DataSet();
da.Fill(ds);
conn.Close();
da.Dispose();
Response.Write("<br/>DataSet--count:--" + ds.Tables[0].Rows.Count);
Response.Write("<br/>DataSet--P_NAME--" + ds.Tables[0].Rows[0]["P_NAME"].ToString());
//-----------------------------------------------------------


執行結果:
DataSet--count:--3
DataSet--P_NAME--咖啡果凍
DataTable--count:--1
DataTable--P_NAME--咖啡果凍

 擷取.PNG111

註:資料表設定:
data  

 


--
補充一個有時候會遇到的問題,如果不透過查詢資料新增一筆資料在DataTable  (將資料列加入至DataTable)
透過json回傳大致上是這麼寫的:(其實就是第一段程式的簡化版)
--
    System.Data.DataTable dt1 = null;
    System.Data.DataRow dr;
    dt1 = new System.Data.DataTable();
    dt1.Columns.Add("state", typeof(String));
    dr = dt1.NewRow();
    dr["state"] = "ok";
    dt1.Rows.Add(dr);

    
    String result;
    result = Newtonsoft.Json.JsonConvert.SerializeObject(dt1, Newtonsoft.Json.Formatting.Indented);
    return result;

回傳的結果如下:



190923:
至於網友很常問到的排序問題,可以用dataset+dataView的方式達到。dataSet如果要排序有幾種方式,可以用以下的方式進行DataView排序,語法如下:

 

private void SortTables(ref DataSet ds, string sort)
{
    foreach (DataTable dt in ds.Tables)
    {
        DataView dv = new DataView(dt);
        dv.Sort = sort;
        DataTable dtSorted = dv.ToTable();
        ds.Tables[dt.TableName].Clear();
        ds.Tables[dt.TableName].Merge(dtSorted);
    }
}

 

它是這麼用的:這個函式會更新dataset,並用指定的欄位排序,二個以上的條件排序記得可以用逗點分隔,各位可以自己測試。
SortTables(ref dataset名稱, "欄位名 ASC")





--
170919:修改平常較常遇到的情況。
170109:修改部分語句,並註明平常較常遇到的情況。
170410:新增將資料列加入至DataTable的教學
190923:新增DataView排序的範例
--

arrow
arrow
    文章標籤
    datatable dataset dataView
    全站熱搜
    創作者介紹
    創作者 貓羽 的頭像
    貓羽

    貓羽的文字日誌

    貓羽 發表在 痞客邦 留言(2) 人氣()