第九周學習筆記:ADO.Net中DataSet的應用
ADO.Net中DataSet的應用
一.思維導圖
一.相關知識點
三大特性
DataSet物件的三大特性:
(1) 獨立性。DataSet獨立於各種資料來源。
(2) 離線(斷開)和連線。
(3) DataSet物件是一個可以用XML形式表示的資料檢視,是一種資料關係檢視。
使用方法
在實際應用中,DataSet使用方法一般有三種:
(1) 把資料庫中的資料通過DataAdapter物件填充DataSet。
(2) 通過DataAdapter物件操作DataSet實現更新資料庫。
(3) 把XML資料流或文字載入到DataSet。
- DataSet類是ADO.NET中最核心的成員之一,也是各種開發基於.Net平臺程式語言開發資料庫應用程式最常接觸的類。每一個DataSet都有很多個DataTables和Relationships。RelationShip應該也是一種表,特殊的是,這個表只是用來聯絡兩個資料表的。每一個DataTable都有很多datarows和datacols, 也包括ParentRelations,ChildRelations 和一些限制條件像主鍵不可以重複的限制。
2. DataSet每一行有一個RowState屬性。主要是反映當前行是否已經被刪掉了,被更新了,還是本沒變。有如下的幾個選項: Deleted, Modified, New, and Unchanged。
3.對DataSet的任何操作,都是在計算機快取中完成的。
在從資料庫完成資料抽取後,DataSet就是資料的存放地,它是各種資料來源中的資料在計算機記憶體中對映成的快取,所以有時說DataSet可以看成是一個數據容器。
4. DataSet使用方法一般有三種:
(1).把資料庫中的資料通過DataAdapter物件填充DataSet
DataAdapter填充DataSet的過程分為二步:
首先通過DataAdapter的SqlCommand屬性從資料庫中檢索出需要的資料。SqlCommand其實是一個Command物件。
然後再通過DataAdapter的Fill方法把檢索來的資料填充DataSet。
(2).通過DataAdapter物件操作DataSet實現更新資料庫
DataAdapter是通過其Update方法實現以DataSet中資料來更新資料庫的。當DataSet例項中包含資料發生更改後,此時呼叫Update方法,DataAdapter 將分析已作出的更改並執行相應的命令(INSERT、UPDATE 或 DELETE),並以此命令來更新資料庫中的資料。
(3). 把XML資料流或文字載入到DataSet
DataSet中的資料可以從XML資料流或文件建立。載入XML資料流和文件到DataSet中是可使用DataSet物件的ReadXml方法。
5.資料繫結分成二類:簡單型資料繫結和複雜型資料繫結。適用於簡單型資料繫結元件一般有Lable、TextBox等,適用於複雜性資料繫結的元件一般有DataGrid、ListBox、ComboBox等。
(1)簡單型資料繫結一般使用這些元件中的DataBindings屬性的Add方法把DataSet中某一個DataTable中的某一行和元件的某個屬性繫結起來,從而達到顯示資料的效果。
比如:textBox1.DataBindings.Add ( "Text" , dsDataSet1, " Customers. CustomerID ") ;
(2)8複雜性資料繫結一般是設定元件的DataSource屬性和DisplayMember屬性來完成資料繫結的。DataSource屬性值一般設定為要繫結的DataSet,DisplayMember屬性值一般設定為要繫結的資料表或資料表中的某一列。
比如:dataGrid1.DataSource = dsDataSet1 ;
dataGrid1.DataMember = " Customers " ;
DataSet的屬性Tables可以獲取該DATASET中表的數量:DataSet.Tables.Count
DataSet的Tables是一個Table陣列,指定其中的一個表:DataSet.Tables[i];//i為
Table在陣列序列中的位置 或 DataSet.Tables["表名"];
通過Table的Rows物件組的Count獲取該表的記錄數:DataSet.Tables[i].Rows.Count;
獲取列數:DataSet.Tables[i].Columns.Count;
二.相關程式碼
private void btn_Load_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); sqlConnection.ConnectionString = "Server=(local);Database=MZJJSFXT;Integrated Security=sspi"; SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = "SELECT * FROM dbo.tb_Department;" + "SELECT * FROM dbo.醫生資訊表;" + "SELECT * FROM dbo.科室資訊表;"; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); sqlDataAdapter.SelectCommand = sqlCommand; DataSet dataSet = new DataSet(); //宣告並例項化資料集,用於儲存查得的多張表; sqlConnection.Open(); sqlDataAdapter.Fill(dataSet); //SQL資料介面卡讀取資料,並填充資料集; sqlConnection.Close(); DataTable DepartmentTable = dataSet.Tables[0]; //宣告部門資料表,對應資料集的表集合中的第1張資料表; DataTable 科室資訊表Table = dataSet.Tables[1];//宣告科室資料表,對應資料集的表集合中的第2張資料表; DataTable 醫生資訊表Table = dataSet.Tables[2];//宣告醫生資料表,對應資料集的表集合中的第1張資料表; DataRelation[] dataRelations = //宣告資料關係陣列; { new DataRelation ("Department_科室資訊表" , DepartmentTable.Columns["No"] , 科室資訊表Table.Columns["科室型別"] , false) , new DataRelation ("科室資訊表_醫生資訊表" , 科室資訊表Table.Columns["科室名稱"] ,醫生資訊表Table.Columns["所在科室"] , false) }; dataSet.Relations.AddRange(dataRelations); //將資料關係陣列批量加入資料集的關係集合中; this.trv_EducationUnit.Nodes.Clear(); //樹形檢視的節點集合清空; foreach (DataRow DepartmentRow in DepartmentTable.Rows) //遍歷院系資料表中的每一資料行; { TreeNode DepartmentNode = new TreeNode(); //宣告並例項化院系節點,該節點對應當前某個院系; DepartmentNode.Text = DepartmentRow["Name"].ToString(); //院系節點的文字設為當前院系的名稱; this.trv_EducationUnit.Nodes.Add(DepartmentNode); //將院系節點加入樹形檢視的(根)節點集合; foreach (DataRow 科室資訊表Row in DepartmentRow.GetChildRows("Department_科室資訊表")) //藉助先前定義的資料關係,遍歷當前院系所在資料行的子行,即下屬所有專業; { TreeNode 科室資訊表Node = new TreeNode(); //宣告並例項化專業節點,該節點對應當前某個專業; 科室資訊表Node.Text = 科室資訊表Row["科室名稱"].ToString(); //專業節點的文字設為當前專業的名稱; DepartmentNode.Nodes.Add(科室資訊表Node); //專業節點加入當前院系節點的節點集合,成為第1級節點之一; foreach (DataRow 醫生資訊表Row in 科室資訊表Row.GetChildRows("科室資訊表_醫生資訊表")) //藉助先前定義的資料關係,遍歷當前專業所在資料行的子行,即下屬所有班級; { TreeNode 醫生資訊表Node = new TreeNode(); //宣告並例項化班級節點,該節點對應當前某個班級; 醫生資訊表Node.Text = 醫生資訊表Row["所在科室"].ToString(); //班級節點的文字設為當前班級的名稱; 醫生資訊表Node.Tag =醫生資訊表Row["拼音碼"]; //班級節點的標籤設為當前班級的編號; 科室資訊表Node.Nodes.Add(醫生資訊表Node); //班級節點加入當前專業節點的節點集合,成為第2級節點之一; } } } } private void trv_EducationUnit_AfterSelect(object sender, TreeViewEventArgs e) { if (this.trv_EducationUnit.SelectedNode.Level == 2) //若樹形檢視的選中節點的級別為3,即選中班級節點; { int 拼音碼 = (int)this.trv_EducationUnit.SelectedNode.Tag; //將樹形檢視的選中節點的標籤轉為整型,即可獲得事先儲存的班級編號; SqlConnection sqlConnection = new SqlConnection(); //宣告並例項化SQL連線; sqlConnection.ConnectionString = "Server=(local);Database=MZJJSFXT;Integrated Security=sspi"; //在字串變數中,描述連線字串所需的伺服器地址、資料庫名稱、整合安全性(即是否使用Windows驗證); SqlCommand sqlCommand = new SqlCommand(); //宣告並例項化SQL命令; sqlCommand.Connection = sqlConnection; //將SQL命令的連線屬性指向SQL連線; sqlCommand.CommandText = "SELECT 姓名,性別,職稱,聯絡電話 FROM dbo.醫生資訊表 WHERE 所在科室[email protected]所在科室;"; //指定SQL命令的命令文字;該命令查詢當前選中班級的所有學生名單,以用作資料網格檢視資料來源; sqlCommand.Parameters.AddWithValue("@所在科室",'1'); //向SQL命令的引數集合新增引數的名稱、值; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //宣告並例項化SQL資料介面卡,同時藉助建構函式,將其SelectCommand屬性設為先前建立的SQL命令; sqlDataAdapter.SelectCommand = sqlCommand; //將SQL資料介面卡的查詢命令屬性指向SQL命令; DataTable studentTable = new DataTable(); //宣告並例項化資料表,用於儲存當前選中班級的所有學生名單,以用作資料網格檢視的資料來源; sqlConnection.Open(); //開啟SQL連線; sqlDataAdapter.Fill(studentTable); //SQL資料介面卡讀取資料,並填充班級資料表; sqlConnection.Close(); //關閉SQL連線; this.dgv_Student.DataSource = studentTable; //設定資料網格檢視的資料來源; this.dgv_Student.Columns["姓名"].HeaderText = "姓名"; //將資料網格檢視的指定列的表頭文字設為中文; this.dgv_Student.Columns["性別"].HeaderText = "性別"; this.dgv_Student.Columns["職稱"].HeaderText = "職稱"; //將資料網格檢視的指定列的表頭文字設為中文; this.dgv_Student.Columns["聯絡電話"].HeaderText = "聯絡電話"; this.dgv_Student.Columns[this.dgv_Student.Columns.Count - 1].AutoSizeMode = //資料網格檢視的最後一列的自動調整列寬模式設為填充(至資料網格檢視右側邊緣); DataGridViewAutoSizeColumnMode.Fill; } } } }
三.效果截圖