用途
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;