1. 程式人生 > >第九周學習筆記:ADO.Net中DataSet的應用

第九周學習筆記:ADO.Net中DataSet的應用

ADO.Net中DataSet的應用

一.思維導圖

 

 

 

一.相關知識點

三大特性

DataSet物件的三大特性:

(1) 獨立性。DataSet獨立於各種資料來源。

(2) 離線(斷開)和連線。

(3) DataSet物件是一個可以用XML形式表示的資料檢視,是一種資料關係檢視。

使用方法

在實際應用中,DataSet使用方法一般有三種:

(1) 把資料庫中的資料通過DataAdapter物件填充DataSet。

(2) 通過DataAdapter物件操作DataSet實現更新資料庫。

(3) 把XML資料流或文字載入到DataSet。

 

  1. 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;
            }
        }
    }                                                                                                    
}

 

三.效果截圖