DataSet 與 DataTable

      在〈DataSet 與 DataTable〉中尚無留言

用途

DataTable是存於記憶中的一張資料表, 好比是一個二維陣列, 由欄位Column及列Row組成. 通常可以把資料庫的資料表全部放入DataTable中, 如此就可以使用離線作業. DataTable可使用SQL語法的select進行資料選取.

DataSet是多個DataTable的集合, 也是存在記憶體之中, 可離線作業

DataTable建立

手動建立空白DataTable

先使用new DataTable()建立一個DataTable物件dt, 再由dt.Columns.Add() 增加欄位.
要新增列資料時, 需使用 dt.NewRow()產生Row物件, 此物件包含每欄的資訊, 再由dt.Rows.Add()加入列, 如下代碼

 DataTable dt = new DataTable();
 dt.Columns.Add("id");
 dt.Columns.Add("姓名");
 dt.Columns.Add("住址");
 DataRow row = dt.NewRow();
 row["id"] = "001";
 row["姓名"] = "Thomas";
 row["住址"] = "台中市";
 dt.Rows.Add(row);

資料庫 to DataTable

要由資料庫將整張資料表填入DataTable, 需透過SqlDataAdapter存取, 如下代碼

string str= "server=ip;database=資料庫;uid=帳號;pwd=密碼;MultipleActiveResultSets=true";
SqlConnection conn = new SqlConnection(str);
conn.Open();
SqlDataAdapter da=new SqlDataAdapter("select * from employee", conn);
DataTable dt = new DataTable();
da.Fill(dt);

DataSet建立

DataSet是多個DataTable的集合, 需先建立一個空白的DataSet物件(ds), 再由ds.Tables.Add()將DataTable加入, 如下代碼

 
string str= "server=ip;database=資料庫;uid=帳號;pwd=密碼;MultipleActiveResultSets=true";
SqlConnection conn = new SqlConnection(str);
SqlDataAdapter da=new SqlDataAdapter("select * from employee", conn);
DataTable dt = new DataTable();
dt.TableName = "員工資料表";
da.Fill(dt);

DataSet ds = new DataSet();
ds.Tables.Add(dt);

請注意, SqlDataAdapter不需要開啟連線(conn.Open()), 也不需關閉連線(conn.Close()), 因為它會全程幫我們處理

一次性整合

將資料庫裏的資料表直接放到DataSet的作法, 如下代碼

string str= "server=ip;database=資料庫;uid=帳號;pwd=密碼;MultipleActiveResultSets=true";
SqlConnection conn = new SqlConnection(str);
DataSet ds = new DataSet();
new SqlDataAdapter("select * from employee", conn).Fill(ds, "員工資料表");

DataTable Select

DataTable可以使用Select SQL語法. Select第一個參數為條件, 若無條件, 可以使用 “” 或null.
第二參數為排序的欄位名稱及排序方式

傳回的值為DataRow [] 陣列

代碼如下

DataRow []rows=ds.Tables["部門資料表"].Select("depNo='001'", "id desc");

MessageBox.Show(string.Format("{0}, {1}", rows[0]["id"], rows[0]["depName"]));

DataTable 與 WPF DataGrid

DataTable可以跟 WPF DataGrid繫結, 這樣就不必從資料庫一筆一筆撈出來, 放入Item, 再把List<Item>與DataGrid繫結了.

首先XAML需設定DataGrid要與DataTable繫結的欄位, 如下

 <DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" Grid.Row="3">
     <DataGrid.Columns>
         <DataGridTextColumn Header="項次" Width="60" Binding="{Binding 項次}" />
         <DataGridTextColumn Header="工項" Width="600" Binding="{Binding 工項}" />
         <DataGridTextColumn Header="單位" Width="50" Binding="{Binding 單位}" />
         <DataGridTextColumn Header="單價" Width="80" Binding="{Binding 單價}" />
         <DataGridTemplateColumn>
             <DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                     <Button Width="100" Click="btnUpdate_Click" Tag="{Binding id}" Content="修改" />
                 </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>
     </DataGrid.Columns>
 </DataGrid>

c# 代碼如下

dataGrid.DataContext = dt.DefaultView;

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *