Transcript 第一章

第十一章
ADO .NET資料庫連線與存取
11-1 如何引用ADO.NET命名空間
在 .NET Framework的架構中是由所使用資料庫(來源)
來決定使用SQL .NET Data Provider或是OLE DB .NET
Data Provider。由於這兩者 .NET Data Provider分屬不
同的命名空間(Namespace),因此,必須使用using 敘述來
引用對應ADO .NET的命名空間,這樣才能在撰寫程式時,
能使用較簡短的ADO.NET物件來存取資料庫。
11-1 如何引用ADO.NET命名空間
1. System.Data:是ADO.NET命名空間的核心,大部分
是由構成ADO.NET架構的類別所組合而成的。它定義
了Tables、Rows、Columns、Constraints和
DataSet所代表的型別。在撰寫程式時若有使用到
DataSet類別,必須在程式開頭用 using 來引用此
命名空間:
using System.Data;
//引用ADO.NET基礎物件
11-1 如何引用ADO.NET命名空間
2. System.Data.OleDb:這個命名空間定義了允許您連
線到OLE DB這類型的資料來源、接受 SQL查詢和使
用OleDbDataAdapter物件的Fill方法將資料填入
DataSet中。包括:



Access
Excel
SQL Server 7.0以下版本的資料庫…等。
 在程式中使用這類型資料庫,必須在程式開
頭用 using 敘述引用此命名空間:
using System.Data.OleDb;
11-1 如何引用ADO .NET命名空間
下表即是ADO.NET在所屬命名空間中各物件命名的對
照表:
命名空間
物件
System.Data.OleDb
System.Data.SqlClient
Connection
SqlConnection
OleDbConnection
Command
SqlCommand
OleDbCommand
DataReader
SqlDataReader
OleDbDataReader
DataAdapter
SqlDataAdapter
OleDbDataAdapter
Parameter
SqlParameter
OleDbParameter
11-2 如何運用Connection物件開
啟、關閉資料庫的連線
ADO.NET所提供的Connection物件,主要是用來與資
料庫來源之間建立連線。Connection物件提供下列
兩種常用方法:
Open方法:用來建立並開啟一個資料庫的連線。
Close方法:將資料庫的連線關閉。
11-2 如何運用Connection物件開
啟、關閉資料庫的連線
引用System.Data.OleDb命名空間(適用Access、
Excel…等資料庫)
1. using System.Data;
2. using System.Data.OleDb;
3. OleDbConnection myConnection;
4. string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + 資料庫檔案路徑 ;
6. myConnection = new OleDbConnection( connStr );
7. myConnection.Open();
// 開啟與資料庫的連線
8. myConnection.Close();
// 關閉與資料庫的連線
11-2 如何運用Connection物件開
啟、關閉資料庫的連線
資料庫檔案路徑輸入須知
 範例:
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=D:\\Tzuchi\\SalaryDB.mdb;Jet OLEDB:Database
Password=1234";
 可輸入相對路徑,反斜線記得要重複。
 如資料庫有密碼保護,請在「Jet OLEDB:Database
Password」屬性中給值。
檢查資料庫目前狀態
if (myConnection.State == ConnectionState.Open)
{
MessageBox.Show("資料庫開啟成功");
myConnection.Close();
}
11-3 如何運用DataReader物件讀
取資料庫
一. Command物件
Command物件可以讓您執行SQL資料庫命令,
以傳送和修改資料、執行預存程序(Stotred
Procedure)、並且傳送或擷取參數資訊。
ExecuteReader方法
執行Command物件中所指定SQL 語法的Select命令,
建立一個DataReader物件以進行資料的瀏覽。
ExecuteNonQuery方法
使用Command物件的ExecuteNonQuery方法,可以新
增、刪除、修改資料庫中的資料,也就是說執行
SQL語法中的Insert、Delete、Update命令。
11-3 如何運用DataReader物件讀
取資料庫
二. DataReader物件
11-3 如何運用DataReader物件讀
取資料庫
引用System.Data.OleDb命名空間(適用Access、
Excel…等資料庫)
【程式片段】
OleDbCommand myCommand;
OleDbDataReader myDataReader;
myCommand = new OleDbCommand ("Select * from Personnel",
myConnection);
myConnection.Open();
myDataReader = myCommand.ExecuteReader();
myDataReader.Close();
myConnection.Close();
11-3 如何運用DataReader物件讀
取資料庫
myCommand = new OleDbCommand ("Select
* from Personnel", myConnection);
 當中“Select * from Personnel”為SQL語法,意
義為「從Personnel資料表中把所有欄位(*)
選擇出來」
 也可指定特定幾個欄位即可,例如


Select id_no, phone from Personnel
myConnection必須為有效的資料庫連線。
11-3 如何運用DataReader物件讀
取資料庫
透過DataReader物件取得資料列(記錄)的欄位名稱
for (int i=0 ; i<myDataReader.FieldCount ; i++)
{
richTextBox1.Text += myDataReader.GetName(i);
}
11-3 如何運用DataReader物件讀
取資料庫
成員
說
明
FieldCount屬性
將目前DataReader由查詢結果所取得資料列(記錄)的欄位總數
傳回。若傳回值為5,表示該筆資料列(記錄)共有5個欄位,其
欄位註標為0~4 (欄位註標由0開始)。
GetName(i)方法
取得第i欄的欄位名稱,欄位註標起始值是由0開始算起。
DataReader物件[i]
取得第i欄的資料內容,欄位註標起始值是由0開始算起。
DataReader[“欄位名稱”]
取得所指定欄位名稱所指的欄位資料。
GetDataTypeName(i)
方法
取得第i個欄位的資料型別,欄位註標起始值是由0開始算起。
GetOrdinal(“欄位名稱”)
方法
取得某個欄位的欄位編號。0為第一欄、1為第二欄、2 為第三
欄…以此類推。
GetValue(i)
方法
取得第i個欄位的資料內容,欄位註標起始值是由0開始算起。
IsDBNull(i)方法
方法
判斷第i個欄位是否沒有資料,欄位註標起始值是由0開始算起,
若沒有資料傳回true,否則傳回false。
Close()方法
完成讀取DataReader物件的查詢結果,可使用這個方法關閉
DataReader物件。
11-3 如何運用DataReader物件讀
取資料庫
三. DataReader常用的屬性與方法
11-3 如何運用DataReader物件讀
取資料庫
四. 如何使用DataReader讀取查詢結果
當你想透過DataReader物件來讀取由資料庫中
所擷取出的查詢結果,可以使用重複結構來檢查記
錄指標是否已經指到EOF檔案結尾符號,若記錄指
標尚未指到EOF表示資料未讀完,便可利用上表
DataReader所提供的方法和屬性,順向逐一取得每
個欄位的名稱和該欄位內所存放的資料;若記錄指
標指到EOF表示資料已經讀取完畢,便可結束讀取
動作。
11-3 如何運用DataReader物件讀
取資料庫
透過DataReader物件來顯示各資料列欄位內的資料。
有下列兩種方式,第一種方式的使用時機是當需要顯
示所有欄位時使用,第二種方式是當僅顯示部分欄位
內容時使用:
while (myDataReader.Read()) // true表示尚未指到EOF
{ for (int i=0 ; i<myDataReader.FieldCount ; i++){
richTextBox1.Text += myDataReader[i] ;}}
while (myDataReader.Read())
{ richTextBox1.Text += myDataReader["欄位名稱1"];
richTextBox1.Text += myDataReader["欄位名稱2"];
richTextBox1.Text += myDataReader["欄位名稱3"];
….
richTextBox1.Text += myDataReader["欄位名稱N"];}
11-4 如何運用DataSet物件來讀
取資料
一. DataSet物件
可說是ADO.NET的主角。
它像是一個記憶體中的資料庫




離線存取資料庫的方式。
例如:應用程式與遠端資料庫分別裝在不同主機上,
當資料庫應用程式向遠端資料庫要求資料時,遠端資
料庫會將所要擷取的全部資料傳到應用程式所在電腦
的記憶體(DataSet)中,此時可與資料庫中斷連線。當
DataSet中的資料更新完畢後,再重新和SQL Server資
料庫進行連線,將資料全部一次更新到SQL Server資
料庫中。因此執行效率佳,適用多用戶端資料存取,
但此種方式須耗費較多的記憶體空間。
11-4 如何運用DataSet物件來讀
取資料
二. DataAdapter物件
DataAdapter物件是資料庫和DataSet之間溝通
的橋樑。DataAdapter物件使用Command物件執行
SQL命令,將由資料庫所擷取的資料送到DataSet,
此時便可使用DataTable物件來存取資料表,將
DataSet裡面DataTable的資料經過處理後再送回資
料庫。
11-4 如何運用DataSet物件來讀
取資料
DataAdapter物件架構圖
11-4 如何運用DataSet物件來讀
取資料
透過DataReader和DataSet存取資料表有何不同?
 DataReader直接提供方法讀取資料表中的資料。
 適合批次處理

DataSet除了提供存取資料表的資料外,還提供了
「管理」資料表的方法,使得使用者可以透過程式
來新增、刪除、修改資料,並與其他控制項進行資
料繫結。
11-4 如何運用DataSet物件來讀
取資料
三. 程式範例
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 資料庫真實路徑;
OleDbConnection conn;
conn = new OleDbConnection(connStr) ;
DataSet myDataSet = new DataSet();
OleDbDataAdapter myAdapter;
// 建立成績資料表的DataTable物件
selectCmd = "Select * from SCORE"; // 查詢資料表
myAdapter = new OleDbDataAdapter(selectCmd, myConnection);
myAdapter.Fill(myDataSet, “成績表”);
// 將資料藉由Adapter填入DataSet物件中一個叫做「成績表」的table中;
11-4 如何運用DataSet物件來讀
取資料
將DadaSet的資料顯示在表單的DataGridView控制項上面

程式範例:
 註:VS 2005的工具箱中改為DataGridView控制項
string myCommand = "Select * from Personnel";
OleDbDataAdapter myAdapter = new OleDbDataAdapter(myCommand, myConnection);
DataSet myDataSet = new DataSet();
myAdapter.Fill(myDataSet); //可以不指定table的名稱或索引
dataGridView1.DataSource = myDataSet.Tables[0];
//指定DataSet中的DataTable給DataGridView的DataSource
11-4 如何運用DataSet物件來讀取資料
四.
如何使用DataSet物件來取得某個DataTable物件
DataTable myDataTable = myDataSet.Tables[0];
取得DataTable的欄位數目。
myDataTable.Columns.Count
取得DataTable的第k個的欄位名稱,註標起始值為0。
myDataTable.Columns[k].ColumnName
取得DataTable的資料總筆數。
myDataTable.Rows.Count
取得DataTable的第i列第j欄的資料內容,註標起始值
為0。
myDataTable.Rows[i][j]
11-4 如何運用DataSet物件來讀取資料
五. 使用DataTable顯示查詢結果的所有記錄
取得DataTable物件的欄位名稱,可使用以下的方
法:
For(int k=0 ; k<myDataTable.Columns.Count ; k++)
{
rtbShow.Text += myDataTable.Columns[k].ColumnName ;
}
11-4 如何運用DataSet物件來讀取資料
取得DataTable物件的欄位資料內容,有下列兩種方
法:
for (int i=0 ; i<myDataTable.Rows.Count ; i++)
{
for(int j=0 ; j<myDataTable.Columns.Count ; j++)
{
rtbShow.Text += myDataTable.Rows[i][j] ;
}
}
foreach(DataRow myDataRow in myDataTable.Rows)
{
foreach(object obj in myDataRow.ItemArray)
{
rtbShow.Text += obj.ToString() ;
}
}
11-5 SQL語法
SQL(Structured Query Language 結構化查詢語言)是
一套標準的資料庫管理與存取語言,它使用接近人類
口語的方式來存取資料庫。
一般常見的 SQL Server資料庫 (如Microsoft SQL
Server、Access…) 都支援 SQL語法。因此 SQL 成為
目前各類型資料庫中最為通用的資料庫存取語言。
11-5 SQL語法
一. Select查詢命令
SQL語法中的Select命令可根據Where子句所設
定的條件式,對資料庫進行資料的查詢或排序工作,
其語法如下:
範例:

Select * from Personnel
 從Personnel中把所有的欄位、所有紀錄選出來

Select * from Personnel order by name
 從Personnel中把所有的欄位、所有紀錄選出來,並且以name,並且以
name作排序(升冪)

Select * from Personnel order by name desc
 從Personnel中把所有的欄位、所有紀錄選出來,並且以name,並且以
name作排序(降冪)

Select id_no, name, gender from Personnel where gender = 0
 從Personnel中僅將id_no、name和gender欄位選出來,其中紀錄的
gender必須符合gender=0才把他挑出來

Select id_no, name, gender from Personnel where gender = 0
or name = '大寶'
11-5 SQL語法
二. 使用SQL語法的注意事項
當要透過Command或DataAdapter物件來執行
SQL語法時,通常會在表單中的TextBox文字方塊控
制項(若其名稱為txtName)內,鍵入條件資料來進
行查詢,其撰寫方式如下:
selectCmd = "Select * From MEMBER Where name = '" +
txtName.Text + "'" ;
myCommand = new OleDbCommand(selectCmd ,
myConnection);
注意:在SQL語法中,字串要用單引號來框住前後。
如果字串當中就有單引號,必須重複兩個單引號(p11-36)。
11-5 SQL語法
三. Insert新增命令
如果要將用戶端表單所輸入的資料,新增到伺
服器端的資料庫中,可使用SQL語法的Insert Into
敘述來做新增一筆資料到該資料表的最後面,其語
法如下:
Insert Into 資料表名稱(欄位名稱1, …,欄位名稱N) Values (資
料1, …,資料N)
注意:字串的資料還是要用單引號來框住前後。
例:
Insert Into Personnel(id_no,name,gender) Values('0001', '大
寶', 0)
11-5 SQL語法
四. Delete刪除命令
SQL提供了Delete敘述讓我們可以刪除所指定
的資料,其語法如下:
Delete From 資料表名稱 Where <條件>
例:Delete From Personnel where id_no= '0001'
11-5 SQL語法
五. UpDate更新命令
當資料庫內某個資料表的某筆資料內容需要做
修改時,可以透過SQL所提供的UpDate命令來修改
指定的欄位資料,其語法如下:
Update 資料表名稱 Set 欄位1 = 資料1 , … ,欄位N = 資料N
Where <條件>
例:Update Personnel Set name = '哈哈哈', phone_no= ‘12345'
where id_no= '0001‘
解讀:將id_no等於0001的找出來後,設定其姓名(name)以及電話號碼
(phone_no)為指定的值
11-5 SQL語法
六. 如何使用Command物件及SQL語法更新資料庫
當撰寫好新增(Insert)、刪除(Delete)、修改
(Update)資料的SQL語法,此時你可以透過Command
物件的ExecuteNonQuery方法來更新資料庫的資料。
其寫法如下:
OleDbCommand myCommand ;
myCommand = new OleDbCommand( SQL語法,
myConnection );
// 使用Command物件的ExecuteNonQuery方法更新資料庫
myCommand.ExecuteNonQuery() ;
11-5 SQL語法
七.
如何使用具名參數的SQL語法
我們也可以使用含有具名參數的SQL語法。使用含有具名
參數之SQL語法執行效果比執行SQL字串還要好,而且不必將
參數中有「’」單引號部份改為「’’」雙引號。參數名稱
前面要加上@:
1. // 建立具有「具名參數」的SQL語法
2. insertCmd = “Insert Into PERSON (name, tel, id_position, salary)
Values(@姓名, @電話, @職稱, @薪資)” ;
3. cmd = new OleDbCommand(insertCmd, myConnection);
4. cmd.Parameters.Add(new OleDbParameter("@姓名", OleDbType.Char)) ;
5. cmd.Parameters.Add(new OleDbParameter("@職稱", OleDbType.Char)) ;
6. cmd.Parameters.Add(new OleDbParameter("@電話", OleDbType.Char)) ;
7. cmd.Parameters.Add(new OleDbParameter("@薪資", OleDbType.Integer)) ;
8. cmd.Parameters["@姓名"].Value = “蔡文龍” ;
9. cmd.Parameters["@職稱"].Value = “技術副總” ;
10. cmd.Parameters["@電話"].Value = “04-12345678” ;
11. cmd.Parameters["@薪資"].Value = 50000 ;
12. cmd.ExecuteNonQuery() ;
第十二章
ADO .NET資料庫瀏覽與繫結
12-1 DataView物件
一. 如何建立DataView物件
DataView(資料檢視)物件允許您在Windows Form和
Web Form的控制項上做DataBinding(資料繫結),
DataView有如DataTable(資料表)的上一層物件,它能
對DataTable的內容做篩選和排序工作。
方法一 將資料表物件的預設檢視內容指定給DataView物件
DataView myDataView = new DataView() ;
myDataView = myDataSet.Tables[“資料表名稱”].DefaultView ;
方法二 建立DataView物件的同時並傳入DataTable物件
DataView myDataView = new DataView(myDataTable) ;
12-1 DataView物件
把經過處理後的資料指定給DataGridView:
dataGridView1.DataSource = myDataView;

指定DataView以及指定DataTable的差別:
 可以直接指定DataTable,只是如果想要保留原來的資
料表,另外在根據某些條件來篩選資料時,並可以使
用DataView來當成資料表的暫存區。
12-1 DataView物件
二. 如何使用DataView物件來排序資料
如果您想對資料表中某些欄位做排序,可以在
DataView物件的Sort屬性來設定其排序運算式。排
序方式可設為「DESC」,表示由大到小做遞減排序;
設為「ASC」表示由小到大做遞增排序,若未設定
排序方式預設為「ASC」。其寫法如下:
myDataView.Sort = “欄位1 [ASC|DESC] ,…….. , 欄位N [ASC|DESC]” ;
【簡例】按照國文(欄位)成績由大到小排序,國文成績
相同時再按照英文(欄位)成績由小到大排序
myDataView.Sort = “國文 DESC, 英文 ASC” ;
12-1 DataView物件
三. 如何使用DataView物件來過濾條件
下面敘述是將myDataView所指的資料表中,
「姓名」欄位內容是「王小明」的資料列(記錄)過
濾出來,其寫法如下:
myDataView.RowFilter = “姓名 = ‘王小明’” ;
下面敘述是將myDataView所指到的資料表中,
「國文」欄位成績是及格的資料列過濾出來:
myDataView.RowFilter = “國文 >= 60” ;
12-1 DataView物件
下面敘述是將myDataView所指到的資料表中,國
文欄位小於等於60且英文欄位大於50的資料列過濾出
來:
myDataView.FowFilter = “國文 <= 60 And 英文 > 50” ;
使用Like子句配合%字元作模糊比對,其簡例如下:
//以下敘述是將myDataView的姓名欄位是「王」開頭的資料列過濾出來
myDataView.RowFilter = “姓名 Like ‘王%’” ;
……
//以下敘述是將myDataView的姓名欄位有「王」的資料列過濾出來
myDataView.RowFilter = “姓名 Like ‘%王%’” ;
12-2 資料繫結
在 .NET Framework所提供的大部份控制項皆有資
料繫結(DataBinding)的功能。
當控制項做資料繫結的動作後,該控制項即會顯
示所查詢的資料記錄。我們將資料繋結的控制項分
為以下三類型來介紹:
12-2 資料繫結
1. 使用Label、LinkLabel1、Button、CheckBox、
RadioButton、TextBox控制項做資料繫結,一次只
能在該控制項上面顯示一筆記錄中的某個欄位的內
容。此種資料繫結的語法如下:
控制項物件名稱.DataBindings.Add (“屬性”, 資料來源, “資料成員”) ;



屬性:指定所要繫結的控制項屬性。
資料來源:指定DataSet、DataView、DataTable物件資料來源。
資料成員:指定要繫結的資料來源欄位。
例如:textBox1.DataBindings.Add(“Text”, myDataSet.Tables[0], “id_no”);
12-2 資料繫結
2. 使用ComboBox1、ListBox、CheckedListBox控制項
做資料繫結,可以顯示所有記錄的某一個欄位資料。
資料繫結語法如下:
控制項物件名稱.DataSource = 資料來源 ;
控制項物件名稱.DisplayMember = 資料成員 ;
 資料來源:指定DataSet、DataView、DataTable物件資料來源。
 資料成員:指定要繫結的資料來源欄位。
例如:comboBox1.DataSource = myDataSet.Tables[0];
comboBox1.DataMember = “id_no”;
12-2 資料繫結
3. 使用DataGrid控制項做資料繫結可以顯示所有記錄
的所有欄位,資料繫結語法如下:
控制項物件名稱.DataSource = 資料來源 ;
控制項物件名稱.DataMember = 資料成員(表格名稱) ;


資料來源:指定DataSet、DataView、DataTable物
件資料來源。
資料成員:指定要繫結的表格名稱。
例如:comboBox1.DataSource = myDataSet.Tables[0];
12-3 資料表的關聯
使用DataSet物件的Relations集合來建立關聯式的資料庫應用程式。
使用操作步驟如下:
1. 建立DataSet物件,再使用DataAdapter物件執行SQL語法,並
使用DataAdapter物件的Fill方法將DataTable物件(查詢資料
的結果)放到DataSet物件中。因為要製作關聯式資料庫,所以
DataSet物件必須要有兩個以上的DataTable物件。其寫法如下:
DataSet myDataSet = new DataSet() ;
OleDbDataAdapter myDataAdapter ;
myDataAdapter = new OleDbDataAdapter(“SQL語法1”, myConnection) ;
myDataAdapter.Fill(myDataSet, "myDataTable1") ;
myDataAdapter = new OleDbDataAdapter(“SQL語法2”, myConnection) ;
myDataAdapter.Fill(myDataSet, "myDataTable2") ;
12-3 資料表的關聯
2. 使用DataSet物件的Relations集合的Add方法加入一
個關聯,並且設定兩個DataTable物件中那兩個欄位要
關聯起來。(這三行也可以寫成一行程式,因為程式太
長,所以我們將它分行撰寫)
myDataSet.Relations.Add(“做完關聯最後結果存放的DataSet名稱",
myDataSet.Tables["myDataTable1"].Columns["myDataTable1要關聯的欄位名稱"],
myDataSet.Tables["myDataTable2"].Columns["myDataTable2要關聯的欄位名稱"]) ;
12-3 資料表的關聯
3. 最後再指定DataGrid控制項的DataSource屬性之資料
來源(可設定DataSet、DataTable、DataView物件),
或DataMember屬性的資料成員即可(可設定DataTable、
DataView、DataTable的關聯欄位名稱)。其寫法如下:
dataGrid1.DataSource = myDataSet ;
dataGrid1.DataMember = "myDataTable1" ;
dataGrid2.DataSource = myDataSet ;
dataGrid2.DataMember = "myDataTable1.關聯名稱" ;
12-4 使用BindingManagerBase來
移動資料記錄
透過BindingManagerBase物件的
BindingContext集合物件可設定想要瀏覽資料記
錄的位置,例如下圖表單中
有
、
、
、
鈕,透過這
四個按鈕可以動態瀏覽每一筆資料記錄。
12-4 使用BindingManagerBase來
移動資料記錄
使用BindingManagerBase物件的操作步驟如下:
1. 宣告BindingManagerBase物件
BindingManagerBase myDindingManagerBase ;
2. 建立Binding物件並指定所要資料繫結的控制項屬性、
資料來源(DataSet物件)及資料成員(表格名稱與欄
位名稱)。其寫法如下:
Binding myBinding1 = new Binding("屬性", 資料來源, "資料成員") ;
Binding myBinding2 = new Binding("屬性", 資料來源, "資料成員") ;
12-4 使用BindingManagerBase來
移動資料記錄
3. 使用控制項的DataBindings.Add方法加入Binding做
資料繫結物件。其寫法如下:
控制項名稱1.DataBindings.Add(myBinding1) ;
控制項名稱2.DataBindings.Add(myBinding2) ;
4. 使用控制項的BindingContext方法建立
BindingManagerBase物件,BindingContext方法必須
傳入資料來源(DataSet物件)及資料成員(表格名稱)。
其寫法如下:
myBindingManagerBase = this.BindingContext[資料來源, "資料成員"] ;
12-4 使用BindingManagerBase來
移動資料記錄
BindingManagerBase物件有幾個重要的屬性與方法,
其如下說明:
屬性/方法
說
明
Position
目前資料位置 0 ~ Count – 1
Count
資料總筆數
AddNew()
加入一筆空記錄
RemoveAt(3)
刪除第 4 筆資料
EndCurrentEdit()
結束目前編輯,將控制項上的資料寫回DataSet
12-4 使用BindingManagerBase來
移動資料記錄
範例 練習使用BindingManagerBase物件與
TextBox控制項做資料繫結的動作,且本例可動態
瀏覽BOOK資料表的上一筆、下一筆之記錄。(p1223)