520 likes | 648 Views
CH08. 資料庫 程式設計. ADO.NET資料庫程式設計. 資料庫觀念. 在上一章介紹過檔案系統之後,這一章要介紹的是另一個更重要的機制--『資料庫系統』。 資料庫也是一個檔案,但是和檔案系統有所不同的是,資料庫提供了結構化的資料儲存和檢索方式,讓查詢和存取更有效率。 檔案系統可以幫助我們將檔案儲存在硬碟 ( 或是其他的媒介 ) 當中,待需要的時候再載入電腦的記憶體當中。但是儲存於硬碟上的檔案是透過目錄與檔名的方式來存放,檔案的內容則是各種文字或是 Binary Code ,與現實生活當中的資料結構差異太大,往往並不容易分類搜尋或是檢索。
E N D
資料庫 程式設計
ADO.NET資料庫程式設計 資料庫觀念 在上一章介紹過檔案系統之後,這一章要介紹的是另一個更重要的機制--『資料庫系統』。 資料庫也是一個檔案,但是和檔案系統有所不同的是,資料庫提供了結構化的資料儲存和檢索方式,讓查詢和存取更有效率。 檔案系統可以幫助我們將檔案儲存在硬碟(或是其他的媒介)當中,待需要的時候再載入電腦的記憶體當中。但是儲存於硬碟上的檔案是透過目錄與檔名的方式來存放,檔案的內容則是各種文字或是Binary Code,與現實生活當中的資料結構差異太大,往往並不容易分類搜尋或是檢索。 而資料庫就是在這個狀況下誕生的機制,它可以幫助使用者(或是程式設計師)以更具有結構的方式來儲存資料。
ADO.NET資料庫程式設計 如果這些資料都透過檔案系統來儲存,當我們要利用電腦進行分類(例如找到所有1999年訂購『白起司』的客戶)恐怕是相當困難。因此就有了Access、SQL Server、Oracle等『資料庫系統』來幫助我們,對這些複雜的資料進行處理。 資料庫觀念 這個畫面是某公司的訂單輸入畫面,您會發現它包含了相當多不同類型的資料,例如客戶的資料(包含送貨地址…)、公司內的業務人員、要訂購的產品、數量與金額…等。
ADO.NET資料庫程式設計 資料庫觀念 我們可以將複雜的單據,化作單純的表格形式(我們稱之為資料表),將同一類的資料儲存在一起方便管理。 例如,底下是幾個不同的資料表(分別是客戶資料、產品資料、以及訂單資料):
ADO.NET資料庫程式設計 因此,一筆資料錄當中,有多個欄位,每個欄位就可以儲存不同的資料,有點類似Excel的sheet,讓使用者可以輕鬆的將資料儲存到資料庫中。資料存入資料庫之後,我們就可以針對特定的欄位排序或是以特定的條件搜尋。 資料庫觀念 一個資料表當中,會有許多的記錄: 例如,我們可以透過簡單的指令碼找出上圖這個『訂貨主檔』資料表當中,客戶名稱為『東遠銀行』的所有訂單資料,並且可以依照訂購的日期先後順序來排序顯示出來。 資料錄具有多的欄位,我們稱之為資料欄(Data Column) 每一筆這樣的記錄我們稱為資料錄(Data Row)
ADO.NET資料庫程式設計 資料庫觀念 資料庫不僅可以支援單一條件單一資料表的搜尋,還可以讓資料表之間交叉比對,例如:找出『公司地址在台北市』且『今年訂單總運費超過5000元』的客戶名單。(這些客戶可能我們要換一家更便宜的市區快遞公司來送貨) 我們還可以將兩三個不同的資料表加以關聯,利用多重條件找出符合的資料:
ADO.NET資料庫程式設計 資料庫對VB.NET開發人員的意義 我們可以透過資料庫現有的這些功能,幫助我們設計的資訊系統來存取資料。資料庫本身均包含搜尋、排序、以及管理功能,絕大部分的資料庫也支援標準的SQL語言,讓開發人員或是使用者可以透過簡單的SQL語法來操作資料庫中的資料,對資料進行搜尋、新增、修改、刪除等功能。 因此,Visual Basic 2005的開發人員,在撰寫資料庫應用程式前,可以在資料庫中先建立資料表,待資料表建立完成之後,再透過程式來新增或是編輯資料。在程式運作的過程當中,資料的儲存和搜尋,都是透過資料庫來完成的,而Visual Basic 2005所開發的程式,則負責提供使用者操作介面,讓程式的使用者可以在畫面上輸入資料,進行資料的驗證,最後透過程式碼將資料儲存到資料庫中。
ADO.NET資料庫程式設計 資料庫對VB.NET開發人員的意義 畫面上的使用者介面您應該相當熟悉,多半是TextBox與Label,再加上一個ToolStrip(工具列)就完成了。但是程式的核心絕對不只是畫面上的操作方式,例如搜尋、上下筆的切換、或是修改儲存等等,重點是如何把使用者輸入的資料儲存到資料庫中,以及如何讀取出來。
ADO.NET資料庫程式設計 資料庫對VB.NET開發人員的意義 當我們利用VS2005建立出上頁的輸入畫面,並且透過程式碼讓使用者輸入的資料存入資料庫之後,您可以檢視資料庫中的內容,將會呈現出下面這樣的樣式:
ADO.NET資料庫程式設計 基本SQL語法 我們前面提到過,絕大部分的資料庫都支援SQL語法,可支援資料庫的新增、修改、刪除與搜尋功能。同樣的,我們剛才建立的SQL Server 2005 Express資料庫也是,我們先看資料的搜尋部份。 Select語法 資料的搜尋可以使用Select語法,這個命令會傳回資料表當中符合條件的記錄,符合條件的記錄可能不只有一筆,而是多筆資料,我們稱這些搜尋出來的結果(一筆或多筆資料)為檢視表(view)。 範例:
ADO.NET資料庫程式設計 Select語法 得到的資料如下圖,作者撰寫了一個『SQL語法測試程式(CH08-01)』,您可以在TextBox當中輸入Select語法,按下『執行』鈕之後,即可將資料顯示在下方的DataGridView中: 上面的Select命令,所搜尋出符合條件的資料會回傳到VB程式碼中,成為一個View,填入DataGridView控制項中。
ADO.NET資料庫程式設計 Select語法 Select語法也支援排序功能,您只須要在Select語法的後面加上Order By [欄位名稱],即可針對搜尋到的資料排序: 其中的『*』代表所有的欄位(在您需要取得資料表中所有欄位時,可以省去輸入欄位名稱),執行的結果如上圖。
ADO.NET資料庫程式設計 Select語法 Order By後面若有多個欄位,可以『,』分隔,您可以在欄位後面接上Asc或Desc,指定該欄位的排序方式是由小到大(Asc)還是由大到小(Desc),當您省略時,以Asc為預設值。 您也可以同時以多個欄位來排序,例如上面這樣的SQL語法,可以取得先以『城市』欄位由大到小排序,當『城市』欄位相同時,再以『公司名稱』由小到大排序的資料
ADO.NET資料庫程式設計 Select語法 除了Order By之外,Select最重要的功能是資料的過濾篩選,您可以透過Where關鍵字來決定讀取資料時哪些要顯示出來。
ADO.NET資料庫程式設計 Select語法 除了『欄位名稱=’值’』之外,您還可以透過Like關鍵字,搜尋局部相同的資料,例如: 由於前面提過Like的意思是,字串中只需要部分相同,而不需全部相同,即被視為符合,因此『連絡人 like '陳%'』這個條件,代表連絡人名稱開頭的一個字只要是『陳』,都會被篩選出來。而『%』符號的意思是,代表不確定數量的任何文字,因此只要連絡人欄位的開頭是『陳』的資料,都符合過濾的條件。
ADO.NET資料庫程式設計 Insert語法 除了搜尋之外,另一個很重要的功能,就是資料的新增,資料新增語法結構如下: 例如: 請注意,在SQL語法當中,所有的字串是以單引號『’』所包圍的文字。例如: 這些以單引號『’』所包圍的文字,都是字串。
ADO.NET資料庫程式設計 Delete語法 Delete語法的功能為刪除記錄,您可以刪除特定一筆資料,或是刪除任何符合條件的資料,其語法如下: 同樣的Where後面也可比照Select命令一樣,透過And, Or, 或是Like等關鍵字,組出適當的刪除條件,凡是符合條件的資料都會被刪除,例如: 上面這樣的指令,會刪除所有在城市欄位中資料為『台北市』的客戶資料。請注意,如果您直接輸入: 而忽略where子句,資料庫將會不問條件,一律將『客戶』資料表中所有的資料刪除。
ADO.NET資料庫程式設計 Update語法 Update語法則可用來更新資料庫中的資料,其語法如下: 和Delete敘述一樣,如果您忽略Where子句,系統會不問條件的一律將該資料表中所有的記錄都加以修改(修改的欄位與內容值依照Set子句決定)。 在程式中我們有兩種更新資料的場合, 其中一種是『修正資料』, 另一種是『計算出某種結果』。
ADO.NET資料庫程式設計 Update語法 存放數字的欄位’ 此為Boolean欄位,只有Yes或No兩種可能(分別以1或0)來表示 將會把『所有的產品』設為不再銷售。(但一般我們不常這麼做,除非公司準備結束營業…)
ADO.NET資料庫程式設計 Update語法 存放數字的欄位’ 此為Boolean欄位,只有Yes或No兩種可能(分別以1或0)來表示 上面這段指令,將會把所有庫存量小於5的資料設為不再銷售。這類的更新處理我們稱之為『資料修正』。
ADO.NET資料庫程式設計 Update語法 存放數字的欄位’ 此為Boolean欄位,只有Yes或No兩種可能(分別以1或0)來表示 上面這段指令將所有單價小於10的產品,通通調漲價格,增加一成的售價。這種更新即是為了計算出某種結果。
ADO.NET資料庫程式設計 如何透過VB程式碼存取資料庫 執行左方SQL Command DataGridView 執行左方的Select SQL Command並將回傳值(Data View)填入下方的DataGridView當中。 CH08-03專案
ADO.NET資料庫程式設計 透過DbAccess類別存取資料庫 在這裡指定要存取的SQL Server 2005 Express資料庫。 執行TextBox中的Select命令,傳回的資料會填入DataTable中
ADO.NET資料庫程式設計 透過DbAccess類別將資料寫回資料庫 這邊填入要執行的SQL指令
ADO.NET資料庫程式設計 透過DbAccess類別和ADO.NET來處理資料 我們撰寫了DbAccess類別來幫我們完成資料庫存取的功能,您可以透過這個DbAccess類別完成絕大部分的資料庫存取需求,而存取資料庫的核心程式碼其實位於DbAccess類別當中。 我們會在後面再介紹DbAccess類別中的程式碼。 前面我們已經明白如何透過DbAccess類別將資料庫中的資料讀取出來,而回傳的資料結構就是DataTable,接著我們要來看,如何透過DataTable來處理資料,例如將資料顯示到畫面上供使用者編輯或瀏覽。 在.NET Framework當中,對資料庫的處理是透過ADO.NET架構,ADO.NET是一組專門負責資料庫存取與運作的類別,它可以讓開發人員以一致的方式存取資料來源。不用因為需要存取不同的資料來源(資料庫),就針對不同的資料來源撰寫個別的程式碼。 而前面我們介紹過的DataTable,就是ADO.NET所提供的一個類別。
ADO.NET資料庫程式設計 DataTable與DataRow類別
ADO.NET資料庫程式設計 將畫面上的資料寫回資料庫 cNorthWind.MDF ShowData(ByVal id As Integer) 將第N筆資料顯示在畫面上
ADO.NET資料庫程式設計 將資料庫中讀取到的資料填入畫面 cNorthWind.MDF ToolStrip_btn_Save.Click
ADO.NET資料庫程式設計 將畫面上目前這筆資料刪除 cNorthWind.MDF ToolStrip_btn_Delete_Click
ADO.NET資料庫程式設計 刪除的功能比較容易處理,只需要抓取到頁面上目前顯示的資料錄編號,然後透過底下的SQL語法將其刪除即可
ADO.NET資料庫程式設計 新增一筆資料 新增的功能對於表單上的使用者介面來說,只是清空畫面,提供一個使用者可以輸入的空間而已。 但是請注意,我們在使用者按下新增鈕時,除了要清空畫面之外,還要透過Insert指令,在資料庫中新增了一筆空白的記錄。 並且把該筆記錄帶出到畫面上…
ADO.NET資料庫程式設計 搜尋功能 搜尋的部分我們額外建立了另一張表單,使用者可以在這個表單上輸入搜尋條件,然後按下搜尋鈕。 當使用者按下搜尋鈕之後,該表單會直接開啟資料庫進行搜尋動作,如果找到符合的資料,就呼叫主頁面上的ShowData函式並傳入記錄編號,將指定的記錄顯示出來。
ADO.NET資料庫程式設計 搜尋功能 cNorthWind.MDF btn_search_Click (Search.vb)
ADO.NET資料庫程式設計 如何將照片儲存到資料庫中
將照片儲存到資料庫 ADO.NET資料庫程式設計 getByte函式:傳入image屬性(也就是圖片本身) ,會回傳一個Byte()陣列(將其存入資料庫),內容是剛才傳入的image物件的檔案實體。
將資料庫 中的照片顯示出來 ADO.NET資料庫程式設計
ADO.NET資料庫程式設計 DbAccess類別 前面說過,我們撰寫了DbAccess類別來幫我們完成資料庫存取的功能,您可以透過這個DbAccess類別完成絕大部分的資料庫存取需求,而存取資料庫的核心程式碼其實位於DbAccess類別當中。
ADO.NET資料庫程式設計 ADO.NET中的資料庫運作模式
ADO.NET資料庫程式設計 ADO.NET中如何對資料庫執行異動(新增、修改、刪除)
ADO.NET資料庫程式設計 ADO.NET中如何對資料庫建立連線 Data Source指定了資料庫的類型,在這邊我們使用的是SQL Express資料庫,而資料庫的位置由AttachDbFilename項目來決定。 Integrated Security=true;意思是指資料庫的使用權限是透過系統管理,在執行程式時,會依照目前使用者的系統帳號來嘗試開啟資料庫。 ADO.NET要與資料庫連線,必須透過連線字串,在連線字串中可以決定資料庫的類型、帳號密碼、連線方式…等資訊。
SqlDataAdapter可以針對指定的資料連線(conn)執行特定的SQL指令,並以Fill指令,將回傳的結果(DataView)填入dtSqlDataAdapter可以針對指定的資料連線(conn)執行特定的SQL指令,並以Fill指令,將回傳的結果(DataView)填入dt ADO.NET資料庫程式設計 透過DataAdapter來讀取資料 透過SqlDataAdapter物件的Fill方法來執行SQL命令(請注意我們有傳入『conn』這個剛才在建立好的資料庫連線物件),並且取得資料;如此一來,我們就可以取得需要的資料,再透過對DataTable的操作來完成程式當中需要的功能。
當我們要對資料庫做寫入的動作時,則透過DataCommand這個物件。我們在DbAccess類別當中,建立了ExecuteCmd這個Method來處理。當我們要對資料庫做寫入的動作時,則透過DataCommand這個物件。我們在DbAccess類別當中,建立了ExecuteCmd這個Method來處理。 ADO.NET資料庫程式設計 透過DataCommand來執行SQL命令 您會發現這個ExecuteCmd是一個多載的方法
ADO.NET資料庫程式設計 8-5-3 透過DataCommand來執行SQL命令 主要的功能在程式6-21行,我們透過建立SqlCommand物件,傳入SQL命令和剛才建立好存放在Private變數中的連結物件Conn,並且視需要(若SQL命令中有『@...』這樣的參數)將傳入的parameter值加入第8行建立的SqlCommand(dc)物件當中,最後再透過SqlCommand物件的ExecuteNonQuery方法來執行這段SQL指令。