ch17 sql by HC121016005929

VIEWS: 7 PAGES: 69

									視窗程式設計
第十七章 資料庫
內容大綱
   17-   1   資料庫基本認識
   17-   2   什麼是ADO.NET
   17-   3   使用對話框連結資料庫
   17-   4   使用程式連結資料庫
   17-   5   資料繫結﹝DataBinding ﹞類別
   17-   6   資料的編輯
   17-   7   資料表單精靈
   習題

                                     2
1 7 - 1 資料庫基本認識
   以檔案儲存資料
     檔案系統(File System)負責儲存
     使用者必須自行負責資料的維護與管理
        程式設計者必須了解資料的型態、長度以及檔案之
         間的關係,並親自撰寫程式才能取得資料
   以資料庫儲存資料
     資料庫管理系統(Database Management System,
      DBMS)負責資料儲存與維護,並協助管理
     程式設計師的工作比較輕鬆,撰寫程式時只要考慮
      『What to do?』,不必煩心『How to do?』
                                            3
 資料表(Table)
    資料表為相關資料項目的集合

       Column(欄)    Column Name(欄位名稱)



 Row
(列)

             Item(資料項)

                                   4
資料集(DataSet)
   我們可從一個或一個以上的資料表中, 使用
    SQL 敘述萃取某些資料項,而形成一個資料
    集合, 此一集合即稱為資料集。
     一個 DataSet 之中可以包含多個 Table 也可以
      設定 Table 之間的關聯
     ADO.NET DataSet 就像是存在記憶體之中的
      一個小型(離線)資料庫


                                      5
鍵(Key)
   資料表之中能夠作為識別項(Identifier)的欄位稱為候選
    鍵(Candidate Key)
      例:學生基本資料表的『學號』與『身份證字號』欄
   在眾多候選鍵之中挑選一個候選鍵作為主鍵(Primary
    Key)
      每一個資料表都應該有一個主鍵,沒有主鍵的資料表
       在進行資料刪除與修改時將遇到困難
   由兩個以上的欄位組成的鍵稱為複合鍵(Composite Key)
      例:訂單明細表一般以『訂單編號』與『產品編號』
       組合成主鍵


                                  6
索引(Index)
   為必須作為查詢依據的欄位建立索引,可以增進
    查詢的效率
     例如:若必須經常執行下列查詢
     SELECT 編號, 姓名, 性別, 職務, 年齡
     FROM 員工基本資料
     WHERE 年齡 < 40
     則應該為『年齡』欄位建立索引
   不可浮濫:太多索引反而會造成資料異動速度變
    慢;不要為不必要的欄位設定索引

                                 7
1 7 - 2 什麼是ADO.NET?
 ADO.NET (ActiveX Data Objects for
  the .NET Framework) 是 .NET Framework
  的資料存取標準
 使用 ADO.NET 所提供的元件可以存取關聯
  式資料庫、XML 和應用程式資料。




                                     8
ADO.NET 的命名空間(Namespace)
   System.Data
    ADO.NET 架構的核心命名空間, 主要是包含了資料庫
    基本物件。例如,資料表(DataTable)、欄位
    (DataColumn)、列(DataRow)及資料集(DataSet)等。
   System.Data.OleDb
    其中的類別可讓您連接至 OLE DB 的資料來源、對來
    源執行SQL 命令存取資料。
   System.Data.SqlClient
    SQL Server 的 .NET 資料提供者的類別,讓您連接到
    SQL Server 執行 SQL 命令存取資料。


                                         9
ADO.NET 的命名空間(Namespace)
   System.Data.Common
    包含 .NET 資料提供者(Data Provider)共用的類別。
   System.Data.SqlTypes
    提供 SQL Server 內原生資料(Native Data)型別的類
    別。這些類別會提供較安全、較快速的資料型別, 來
    替代其他的資料型別。使用這個命名空間中的類別,
    可避免萬一發生遺失精確度的情況時所造成的型別轉
    換錯誤。
   System.Xml
    針對處理 XML 文件, 所提供標準架構的類別。


                                       10
用戶端應用程式透過 ADO.NET 元件存取後端資料庫的架構圖




                             11
.NET 資料提供者(Data Provider)
   .NET 資料提供者的用途是
      連接資料庫
      執行命令
      擷取結果
   資料存取的結果可能會經過直接處理、放入
    ADO.NET DataSet 物件、與來自多種來源的資料
    合併,或者在各層間遠端傳遞。


                                12
.NET 資料提供者(Data Provider)
核心物件




                            13
SQL .NET Data Provider VS.
OLE DB .NET Data Provider
   SQL Server .NET 資料提供者
    使用特定通訊協定與 SQL Server 通訊,用來直接存取
    SQL Server,可達到最佳效能,其命名空間為
    System.Data.SqlClient 。可存取 MS SQL Server 2000、
    Oracle 8i/9i/10g、MySQL 等資料庫伺服器。
   OLE DB .NET 資料提供者
    使用原生 OLE DB 啟用資料存取,可存取各種 OLE DB 資
    料來源,例如 MS Access、OLAP Services、Directory
    Services 或其他異質資料庫,其命名空間為
    System.Data.OleDb



                                                 14
SQL .NET Data Provider VS.
OLE DB .NET Data Provider




                 Firebird
Oracle

         MySQL

                             15
1 7 - 3 使用對話框連結資料庫
   在上一節中我們認識了.NET 資料提供者的核心物
    件, 現在就讓我們來學習如何在 C# 的設計階段,
    能夠自動產生這些物件, 並且透過這些物件, 只要
    寫極少的程式, 就可以連結到資料庫。




                            16
範例17-3a

   MS Access 資料庫的範例檔 Northwind.mdb 中
    的『客戶』資料表的內容如下, 請利用ADO.NET
    提供的物件, 顯示出來。




                                    17
範例17-3a
Step-1
 新增視窗應用程式專案
 進入伺服器總管
 加入資料連線




               18
範例17-3a
Step-2




          19
範例17-3a
Step-3




          20
範例17-3a
Step-4
 將『客戶』資料表
  拖曳至表單內
 確認出現下列項目
  oleDbConnection1
  oleDbDataAdapter1




                      21
範例17-3a
Step-5
   右擊oleDbAdapter1
    產生資料集




                      22
範例17-3a
Step-6




          23
範例17-3a
Step-6
 於表單內配置 DataGrid
 將DataGrid 的 DataSource 設定為
  dataSet11.客戶




                               24
25
範例17-3a
Step-7
   於表單 Load 事件中鍵入下列程式碼:
    oleDbDataAdapter1.Fill(dataSet11);




                                         26
27
1 7 - 4 使用程式連結資料庫

   建立 ConnectionString
   以 ConnectionString 建立 Connection 物件
   建立 SQL 的 SELECT 敘述
   以 SQL 敘述與 Connection 物件建立 DataAdapter
   以 CommandBuilder 建立 INSERT、UPDATE、DELETE
    敘述
   以 DataAdapter 填滿 DataTable




                                               28
連接 SQL Server 的
ConnectionString
   要件
     data   source 指定資料庫伺服器,可以是資料庫伺服器
      名稱,也可以是資料庫伺服器的 IP 位址。(local) 指本
      機的資料庫伺服器。
     user id 登入資料庫的帳號
     password 登入密碼
     initial catalog 資料庫名稱,一個資料庫伺服器上面通
      常有很多個資料庫,因此必須指定一個
   範例
data source=(local);user id=sa;password=1234;initial catalog=Northwind
                                                                   29
連接 MS Access (OleDB)的
ConnectionString
   要件
     Provider 資料提供者(驅動程式)
     user id 帳號,若資料庫不需要帳號,則此項可
      以省略
     password 密碼,如果不需要密碼(密碼為空
      白)則可以省略此項
     data source 資料庫檔案名稱(包含路徑)
   範例
Provider=Microsoft.Jet.OLEDB.4.0;user id=Admin;data source=C:\Northwind.mdb
                                                                       30
選擇資料提供者(Data Provider)
   我們必須要先確定欲連結資料庫的種類, 以
    選擇適當的.NET 資料提供者。例如, SQL
    Server 7.0 以上的版本, 要在程式最開始的
    地方, 加上以下敘述:
       using System.Data.SqlClient;
   若要連結OLE DB 資料來源, 像是Access
    資料庫, 則要加上以下敘述:
       using System.Data.OleDb;

                                       31
 建立 Connection 物件
    連接 SQL Server
using System.Data;
using System.Data.SqlClient;
...
string cs = "data source=(local);user id=sa;password=;initial catalog=Northwind";
SqlConnection conn = new SqlConnection(cs);


    連接 MS Access
using System.Data;
using System.Data.OleDb;
...
string cs = "Provider=Microsoft.Jet.OLEDB.4.0;data source=C:\Northwind.mdb";
OleDbConnection conn = new OleDbConnection(cs);
                                                                              32
建立 Command 物件
 Command 物件的用途為傳送 SQL 指令
 SQL Server 版


    string sql = "SELECT * FROM customers";
    SqlCommand cmd = new SqlCommand(sql, conn);



    SqlCommand cmd = new OleDbCommand();
    cmd.CommandText = "SELECT * FROM customers";
    cmd.Connection = conn;

                                                   33
建立 Command 物件
   OleDb版
string sql = "SELECT * FROM customers";
OleDbCommand cmd = new OleDbCommand(sql, conn);



OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = "SELECT * FROM customers";
cmd.Connection = conn;




                                                  34
建立 DataAdapter 物件
 當我們設定SQL 敘述後, 必須藉由建立
  DataAdapter 物件與Command 物件連結,
  並執行 SQL 敘述擷取資料至用戶端
 SQL Server 版
                        SqlDataAdapter da = new SqlDataAdapter();
                        da.SelectCommand = cmd;
   MS Access 版
    OleDbDataAdapter da = new OleDbDataAdapter();
    da.SelectCommand = cmd;

                                                              35
建立DataSet 物件
   當DataAdapter 物件擷取資料至用戶端後,
    利用 Fill 方法, 將資料填入DataSet 物件。
    例如, 我們要從上例的cm 物件, 將『客戶』
    資料表中的所有紀錄填入DataSet 物件
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds, "客戶");




                                                       36
 整套串起來,SQL Server 版

string sql = "SELECT * FROM customers";
string cs = "data source=(local);user id=sa;password=;initial catalog=Northwind";
SqlConnection conn = new SqlConnection(cs);
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);




                                                                               37
 整套串起來,MS Access 版
string sql = "SELECT * FROM customers";
string cs = "Provider=Microsoft.Jet.OLEDB.4.0;data source=C:\Northwind.mdb";
OleDbConnection conn = new OleDbConnection(cs);
OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);




                                                                           38
建立與連結 DataGrid 物件
   欲將取得的資料, 藉由表單輸出, 必須先於
    表單配置DataGrid 物件。其次, 再設定
    DataSource 屬性, 如以下敘述:
    dataGrid1.DataSource = ds.Tables["客戶"];
    // 將結果顯示至DataGrid 物件




                                              39
範例17-4a
   使用本節所介紹的程式敘述, 產生
    ADO.NET 物件, 重做範例17-3a, 並將結果
    顯示出來。




                                  40
範例17-4b
   示範不使用『Command』物件, 重做範例
    17-4a, 並請自行比較兩範例的程式碼。




                             41
1 7 - 5 資料繫結﹝DataBinding ﹞
類別
   資料繫結可以讓控制項與資料來源產生繫
    結, 顯示資料來源的資料。我們在此介紹兩
    種資料繫結, 分別是單一欄位與多個欄位值
    的繫結。




                             42
單一欄位值的資料繫結
   有一些控制項(Control), 像是TextBox、
    CheckBox 、RadioButton 等, 可以與資料
    來源結合, 用來顯示某一欄位的值




                                     43
單一欄位值的資料繫結
   語法
     Control.DataBindings.Add("Property", DataSource, "DataMember");
   Property:是控制項的某個屬性。
   DataSource:可以是 DataSet、DataTable 或 DataView。
   DataMember:
      如果 DataSource 是 DataSet, DataMember 就是「資料表.欄位名
       稱」
      如果 DataSource 是 DataTable, DataMember 就是「欄位名稱」。
   例
      txtCustomerId.DataBindings.Add("Text", ds, "客戶.客戶編號");




                                                                 44
多個欄位值的資料繫結
 最常見的控制項為 DataGrid, 可以顯示多個
  欄位的多筆記錄。
 例如, 以下敘述將『客戶』資料表的內容,
  由DataGrid 元件顯示出來。
    DataGrid1.DataSource = ds; // ds 為 DataSet
    DataGrid1.DataMember = "客戶";



                                                 45
範例17-5a
   將Access 資料庫
    "C:\CsBook\Northwind.mdb"『客戶』資料
    表的內容, 利用本節介紹的兩種資料繫結,
    顯示出來。




                                  46
資料的編輯
   取得特定欄位的資料
    string name = (string)ds.Tables["客戶"].Rows[0]["客戶名稱"];


   更改欄位值

    ds.Tables[0].Rows[0]["生日"] = DateTime.Parse("1967/09/14");




                                                                 47
資料的編輯
 以 DataAdapter 的 Update() 方法將更動過
  的資料寫回資料庫
 以 DataSet 和 DataTable 的
  AcceptChanges() 方法將紀錄的更動狀態
  清除
 利用 CommandBuilder 自動建立
  InsertCommand、UpdateCommand、
  DeleteCommand

                                48
protected void UpdateData(DataSet ds, string tableName)
{
  string sql = "SELECT * FROM " + tableName;
  SqlConnection conn = new SqlConnection(ConnectionString);
  SqlDataAdapter da;
  SqlCommandBuilder cb;
  try
  {
    da = new SqlDataAdapter(sql, conn);
    cb = new SqlCommandBuilder(da);
    conn.Open();
    da.Update(ds.Tables[tableName]);
    ds.Tables[tableName].AcceptChanges();
  }
  catch (Exception ex)
  {
    logger.Error(ex.ToString());
  }
  finally
  {
    conn.Close();
  }
}
                                                              49
記錄指標的移動
   當 DataSource 與控制項產生資料繫結之後,
    利用 BindingManagerBase 類別來處理記
    錄指標。而這個類別主要利用兩個重要的
    屬性




                               50
記錄指標的移動
 使用 BindingContext 類別建立或傳回被收
  納資料繫結控制項所使用之資料來源的
  BindingManagerBase
 最常見的情形是使用 Form 類別的
  BindingContext 來傳回表單上資料繫結控
  制項的 BindingManagerBase 物件
BindingManagerBase bm;
bm = this.BindingContext[ds, "客戶"]; // this 為表單本身
                                                    51
記錄指標的移動

   bm 之後, 就可以透過此物件
 取得
 移動記錄指標
  bm.Position += 1; // 將記錄向後移動一筆
  bm.Position -= 1; // 將記錄向前移動一筆




                                   52
範例17-6a
   使用資料繫結, 重做範例17-5a, 使得使用者
    可使用上一筆、下一筆、首筆及尾筆等按
    鈕, 而移動記錄。




                           53
記錄的查詢
   在設計資料庫系統時, 前端維護畫面一定要
    具備四項功能:
     增:新增資料
     刪:刪除資料
     查:搜尋(過濾)
     改:編輯資料內容




                       54
55
   運用技巧設計Select + Where 條件之SQL 敘述

       string strQuery = "Select * From 客戶";
       if (txt客戶編號.Text != "")
         strQuery = strQuery + " Where 客戶編號='" +
         txt客戶編號.Text + "'";

   將所得到之SQL 敘述傳給後端資料庫, 並將自資料庫擷取之記錄, 傳入
    DataSet 物件(ds)

       cn.Open();
       cm.CommandText = strQuery;
       cm.Connection = cn;
       da = new OleDbDataAdapter(cm);
       da.Fill(ds, "客戶");
                                                   56
最後利用資料繫結, 將所擷取之記錄顯示出來。其敘述如下:
  ' 顯示單一欄位值的資料繫結
  txt客戶編號.DataBindings.Add("Text", ds, "客戶.客戶編號");
  txt公司名稱.DataBindings.Add("Text", ds, "客戶.公司名稱");
  txt連絡人.DataBindings.Add("Text", ds, "客戶.連絡人");
  ' 顯示多個欄位值的資料繫結
  dataGrid1.DataSource = ds;
  dataGrid1.DataMember = "客戶";




                                                     57
範例17-6b
   重做範例17-6a, 並加入查詢之功能。




                           58
記錄的新增
   如果要新增一筆記錄至『客戶』資料表, 可利用
    BindingContext 物件的 AddNew 方法

this.BindingContext[ds, "客戶"].AddNew(); // this 為表單本身
// 利用以下敘述將值填入各個欄位
ds.Tables["客戶"].Rows[bm.Position]["客戶編號"] = txt客戶編號.Text;
ds.Tables["客戶"].Rows[bm.Position]["公司名稱"] = txt公司名稱.Text;
ds.Tables["客戶"].Rows[bm.Position]["連絡人"] = txt連絡人.Text;




                                                            59
   但是要注意, 這時並未將資料寫入資料庫, 必須
    再使用以下敘述, 將資料真正的寫入資料庫。
    OleDbCommandBuilder cb = new
       OleDbCommandBuilder(da);
    // da 為DataAdapter 物件
    cb.DataAdapter.Update(ds.Tables["客戶"]);
    // ds 為DataSet 物件
   那如果我們做了一半卻想取消這筆新增的記錄,
    又要如何處理呢?利用以下敘述即可。
    this.BindingContext[ds, "客戶"].CancelCurrentEdit();
    this.ds.RejectChanges() ;



                                                         60
記錄的修改
   如果要修改一筆記錄可直接將欲修改的值
    填入欲修改的欄位:
    ds.Tables["客戶"].Rows[bm.Position]["客戶編號"]
    = txt客戶編號.Text;
    ds.Tables["客戶"].Rows[bm.Position]["公司名稱"]
    = txt公司名稱.Text;
    ds.Tables["客戶"].Rows[bm.Position]["連絡人"]
    = txt連絡人.Text;

                                           61
   但是這時並未將資料寫入資料庫, 必須再使用以下
    敘述, 將資料真正的寫入資料庫。
    OleDbCommandBuilder cb = new
       OleDbCommandBuilder(da);
    //da 為DataAdapter 物件
    cb.DataAdapter.Update(ds.Tables["客戶"]) ;
    //ds 為DataSet 物件
   或是使用以下敘述, 放棄修改。
    this.BindingContext[ds, "客戶"].CancelCurrentEdit();
    this.ds.RejectChanges();


                                                         62
記錄的刪除
   如果要刪除一筆記錄, 可利用 BindingContext 物
    件的 RemoeAt 方法, 其敘述如下, 敘述中 Position
    是記錄指標
    this.BindingContext[ds, "客戶"].RemoveAt(
    this.BindingContext[ds," 客戶"].Position);




                                               63
記錄的刪除
   同樣地, 最後要真正刪除這筆記錄, 必須再
    使用以下敘述, 才能將資料真正的刪除。
    OleDbCommandBuilder cb = new
      OleDbCommandBuilder(da);
    //da 為DataAdapter 物件
    cb.DataAdapter.Update(ds.Tables["客戶"]);
    //ds 為DataSet 物件


                                              64
範例17-6c
   重做範例17-6b, 並加入新增、修改、刪除
    之功能。




                             65
資料表單精靈
   VisualStudio .NET 提供 "精靈" 的功能, 讓
    我們可以在不用寫任何程式的情況下, 就很
    方便的設計出具有新增、修改以及刪除等
    功能的前端維護畫面, 請看以下範例說明。




                                   66
範例17-7a
   請使用資料表單精靈, 製作出Access 資料
    庫"C:\CsBook\Northwind.mdb"『客戶』資
    料表的前端維護畫面, 該畫面並包含移動記
    錄指標、新增、修改以及刪除的功能。




                                  67
習題
   1. 若某次考試成績如下:
    (1) 請寫程式將以上資料以資料庫儲存。
    (2) 請寫程式讀取以上資料, 計算平均, 並顯示以
      上資料。
    (3) 請將平均寫入資料庫。




                                 68
習題

 2.   假設您要開設婚姻介紹所。
  (1) 請問您的資料欄位為何?
  (2) 您的新增畫面與功能為何?
  (3) 您的查詢畫面與功能為何?
  (4) 您的刪除畫面與功能為何?



                      69

								
To top