DataSet
DataSet DataSet 其實就是一個在記憶體中的資料結構 將資料庫的資料複製到記憶體中,用表格的方式來儲存 很容易進行取得、傳遞與顯示裡面的資料 DataAdapter Command Connection DB Product Price Quantity Ants $ 0.49 5000 Birds $ 4.49 500 Cats $29.95 100 Dogs $79.95 20 DataSet
為什麼要使用 DataSet ? DataSet = 離線式的 Recordset 允許你 : 特別是在分散式應用程式中特別有用 … 資料是由伺服端複製回來 然後在用戶用端離線處理資料 允許你 : 減少資料庫伺服器的負載 關閉資料庫連線,並且離線處理資料 特別是在分散式應用程式中特別有用 …
填滿 DataSet 使用 DataAdapter 物件填滿 DataSet 例如: 將產品資料填入 DataSet Product Price Quantity Ants $ 0.49 5000 Birds $ 4.49 500 Cats $29.95 100 Dogs $79.95 20 sql = "Select * From Products;" . Dim adapter As ss.SqlDataAdapter, ds As System.Data.DataSet dbConn = New ... dbCmd = New ... adapter = New ss.SqlDataAdapter(dbCmd) ds = New System.Data.DataSet() dbConn.Open() adapter.Fill(ds) dbConn.Close() ds.Tables(“Table”).TableName = “Products” ‘** 修改 DataSet 中表格的名稱 … "Products"
新增Form2表單
DataSet 就像資料庫一樣 DataSet : 範例: 可以儲存你想要處理的所有資料 可以搜尋、排序、修改 將整個 Sales 資料庫的資料填滿 DataSet sql = "Select * From Customers; Select * From Orders; " & _ "Select * From OrderItems; Select * From Products;" . dbConn.Open() adapter.Fill(ds) dbConn.Close()
瀏覽 DataSet 可以逐筆、逐欄位存取 … 例如: 顯示產品名稱 . Dim row As System.Data.DataRow, name As String For Each row In ds.Tables("Products").Rows name = Convert.ToString(row.Item("ProductName")) Me.ListBox1.Items.Add(name) Next row
DataGridView 是很強大的控制項 使用者可以修改資料 使用者可以新增資料 使用者可刪除資料 但是,所有資料修改都只在 DataSet 中 如果要寫回資料庫,要另外連接資料庫進行更新 …
確認是否修改DataSet 使用者按下Delete Private Sub DataGridView2_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles DataGridView2.UserDeletingRow Dim r As System.Windows.Forms.DialogResult r = MessageBox.Show("sure?", "", MessageBoxButtons.OKCancel) If r = Windows.Forms.DialogResult.Cancel Then e.Cancel = True End If End Sub
確認是否修改DataSet BindingNavigator的deleteitem屬性要設定成 “無” Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click If MessageBox.Show("確定刪除", "警告", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then Me.BindingSource1.RemoveCurrent() ''下面可以自行加入是否要儲存的程式碼 End If End Sub
將修改寫回資料庫 連線資料庫,執行 DataAdapter 的 Update() 方法 問題: 如何解決資料修改的衝突問題? 如果不需要修改資料,請將 DataGridView 設定成 ReadOnly = True . ‘** 從 DataGrid 物件取回原本的 DataSet … ds = CType(Me.DataGrid1.DataSource, System.Data.DataSet) ‘** 重設表格名稱 ‘** 讓 .NET 來建立 Insert, Update, Delete 三個命令 Dim cmdBuilder As ss.SqlCommandBuilder cmdBuilder = New ss.SqlCommandBuilder(adapter) dbConn.Open() adapter.Update(ds) ‘** 如果發生衝突,會產生例外 … dbConn.Close()
將修改寫回資料庫
將修改寫回資料庫