Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
!
ASP.NET網頁設計與 C#
ADO.NET簡介 ADO.NET是微軟.NET平台所提供的新世代資料存取技術,ADO.NET的原文是 ActiveX Data Objects for the .NET Framework (ADO.NET);而 ADO.NET是包含在.NET Framework之中,可以透過 ADO.NET的資料存取技術來存取包括資料庫、XML 和應用程式的資料。所以本章將會利用到 SQL 四個基本語法搭配 ADO.NET 的技術,透過程式去執行資料庫的查詢、新增、修改與刪除的動作。
ADO.NET資料庫存取技術
6-1
6-2 在使用 ADO.NET技術來取存資料庫時,有兩種方式可以選擇(表 6-1)。
方式 說明
精靈化
凡是以精靈設定方式完成資料庫的存取動作,都可歸類到【精靈化】方式這
個範疇。就是以【工具箱】的【資料】中的 SqlDataAdapter 資料配接器組態精靈,以精靈化的選擇設定方式,以拖曳及設定的方式完成。此方式優點是快
速簡單。
6-2
程式化
凡是以程式化的方式撰寫一切所需的資料庫存取程式碼,都
化】方式這個範疇。就是完全以程式設計的方式完成,從建
選擇資料配接器或直接資料庫存取、把資料填入 DataSet等等料存取目的,全部透過程式設計師一行一行的編寫,此方式
功能強大。
表 6-1:ADO.NET 取存方式
上面兩個方式是筆者對於 ADO.NET 存取方式的分類,之所以式的原因,是因為 ADO.NET 的技術在剛開始學習入門時,由對於 C#.NET 的基本語法就不太熟,後天加上對資料庫運作的是很懂,所以有蠻多初學者對於如何以 ADO.NET 技術來對資生的很大的障礙。在此給各位讀者一個建議,請多加練習第四
制項與資料庫查詢動作,反覆熟練,對於資料庫連線的程序及
清楚,一直到可以用【程式化】方式寫出【精靈化】方式所做
這時對 ADO.NET資料庫的操作存取才可以說是成功了。
可歸類到【程式
立資料庫連線、
,一直到完成資
優點是彈性高及
區分這兩種方
於初學者先天
原理方式又不
料庫做存取產
章 DataGrid控概念會愈來愈
的一切動作,
I 6 IASP.NET資料庫存取技術
資料庫讀寫應用實例 接下來的例子將示範如何以 ADO.NET 程式完成對資料庫的查詢、新增、修改與刪除,而對資料庫存取動作其 SQL語法有分固定語法與帶參數語法兩種(表 6-2)。
語法
6-3
說明
固定語法 所謂的固定語法是 SQL語法中所有的項目與條件式都是固定的,也就是很明確指定 where條件式的條件。
帶參數語法 帶參數語法就是不把 SQL語法的欄位值寫死,只是預留一個定義,留待後面以程式的方式來動態將欄位值傳入,這種做法是最有彈性的,也比
較能符合現實世界的需求。
表 6-2:SQL 料庫存取語法
6-3-1 固定語法
而固定語法又分為二種,一種是單純的查詢(select),另一種是對資料庫做異動( insert、 update 與 delete),然而差異也只有 ExecuteReader()與ExecuteNonQuery()這兩個方法的區別了。
型態 語法
Select
SqlConnection conn=new SqlConnection("data source=localhost;initial catalog=myDB;user id=sa;password=12345");
conn.Open();
SqlCommand cmd=new SqlCommand("select陳述式",conn);
SqlDataReader dr=cmd.ExecuteReader();
SqlConnection conn=new SqlConnection("data source=localhost;initial catalog=myDB;user id=sa;password=12345");
conn.Open();
SqlCommand cmd=new SqlCommand("SQL陳述式 ",conn);
cmd.ExecuteNonQuery();
Insert
Update
Delete
表 6-3:ADO.NET 固定語法
6-3
6-4
!
ASP.NET網頁設計與 C#
! 程式說明:
! SqlConnection
SqlConnection 是用來建立資料庫連線,而 SqlConnection conn=new SqlConnection(字串)這種型式是物件導向的一種寫法,表示 conn 是繼承SqlConnection這個類別,conn繼承 SqlConnection這個類別後就具有資料庫連線所需的種種設定,而 new則是表示初始化 conn這個物件,並為其配置記憶體,關於物件導向方面的知識,在後面會有專門的章節來討論。
而字串 "data source=localhost;initial catalog=myDB;user id=sa;password =12345"含有四個參數設定,其作用是作資料庫連線所需的資訊,說明如下:
# data source=localhost是指定來源 SQL Server伺服器的位置,如果是本機的話則用 localhost或是一個點「.」的符號來表示;另外也可用 IP或是主機名稱來指定。
# initial catalog=myDB是指定要使用這個 SQL Server中的哪一個資料庫,而 myDB是我們之前所建立的一個資料庫。
# user id是指定與 SQL Server連線所使用的帳號,在此是以 sa帳號來做登入,但在 SQL Server 中 sa 帳號擁有最大權限,為了教學方便故使用 sa 帳號,在正式環境請另建一個帳號來替代,否則權限太大會有安全上的問題。
# password則是 user id所指定帳號的密碼。
! conn.open()
conn.open()則表示是將 conn 資料庫連線正式開啟,若只有定義SqlConnection而沒有開啟,是無法從這個連線讀到任何資料的。
! SqlCommand
SqlCommand 是下達 SQL 語法或預儲程序(store procedure)的用途,可以將 SQL 語法定義在 SqlCommand(字串,conn)的字串中,而字串後面接的conn就是指定要使用這個連線來執行 SQL 語法,連線是一定要指定的,否則電腦會不知要使用哪個連線。
! SqlDataReader
SqlDataReader稱之為資料讀取器,其用於讀取資料,也就是 SqlCommand中若使用 select讀取資料的 SQL語法就要搭配 SqlDataReader。
6-5
ASP.NET資料庫存取技術 I 6 I
! ExecuteReader()
如果SqlCommand中使用的是 select的SQL語法,就要搭配ExecuteReader()這個方法來使用,ExecuteReader是由 Execute與 Reader二個單字所組成,前者是執行,後者是讀取器的意思,顧名思義 select 的 SQL 語法當然要和ExecuteReader()來做配對。
! ExecuteNonQuery()
當您使用 insert、update或 delete時,請和 ExecuteNonQuery()做搭配,其NonQuery意思是非查詢,那除了 select叫做查詢外,其他三個就是非查詢,所以 ExecuteNonQuery()是和 insert、update或 delete來做搭配。
! 對於 ExecuteReader()和 ExecuteNonQuery()搭配使用時機請務必弄清楚,否則執行 SQL命令時會產生錯誤。
只要知道每行程式是做什麼用的就可以了,不必將解說細節一一背起來,倒
是固定語法一定要記起來,因為這就是 ASP.NET資料庫的核心程式所在,所有的應用幾乎都是以這個資料庫存取語法做應用變化。
範例 6-1:以 Select查詢資料庫資料
本範例要利用 Select 語法,透過 ADO.NET 技術從資料庫讀取資料,並以DataGrid控制項將資料顯示出來。
! 步驟一:新增專案
請在 VS.NET 開發工具中新增一個專案,選擇 ASP.NET WEB應用程式,並命名為 VC6-1。
! 步驟二:版面配置
1. 如圖 6-1所示,從【工具箱】中拖曳進一個 DataGrid控制項,並拖放到適當位置。
6-6
!
ASP.NET網頁設計與 C#
圖 6-1:拖曳控制項
2. 調整 DataGrid控制項的大小及位置,如圖 6-2。
圖 6-2:設定 DataGrid 控制項
I 6 IASP.NET資料庫存取技術
3. 設定 DataGrid控制項的格式化 請點選 DataGrid 控制項,再點選【屬性視窗】下面的【自動格式化】,選擇您想要的格式來美化 DataGrid,然後按【確定】按鈕結束,DataGrid 控制項就會有個美麗的外觀(圖 6-3)。
圖 6-3:DataGrid 控制項的格式化
! 步驟三:建立程式碼
請點選【方案總管】視窗中的 WebForm1.aspx 程式,按滑鼠右鍵選取【檢視程式碼】(圖 6-4)。
6-7
6-8
!
ASP.NET網頁設計與 C#
圖 6-4:檢視程式碼
之後會出現一個 WebForm1.aspx.cs的程式碼後置檔案(圖 6-5)。
圖 6-5:程式碼後置檔案
I 6 IASP.NET資料庫存取技術
1. 先加入 using System.Data.SqlClient;命名空間,此段程式碼是手動寫 SQL Server資料庫連線會用到的命名空間。
2. 這裡要在程式載入時,自動執行資料庫讀取及 DataGrid 顯示資料,請在
Page_Load程式區塊內加入程式碼,程式碼如下:
private void Page_Load(object sender, System.EventArgs e) { //以 SqlDataReader dr來讀取㈾料 SqlConnection conn=new SqlConnection("data source=localhost;initial catalog=myDB;user id=sa;password=12345"); conn.Open(); SqlCommand cmd=new SqlCommand("select * from product",conn); SqlDataReader dr=cmd.ExecuteReader(); //以 DataGrid來顯示 SqlDataReader dr的㈾料 DataGrid1.DataSource=dr; DataGrid1.DataBind(); }
! 程式說明:
! 有的讀者可能會問:為何須要先加入「using System.Data.SqlClient; 」這行程式碼?這是因為要告訴.NET 系統,程式所要連線的資料庫為 MS SQL Server資料庫。然而為何.NET 不事先替使用者做好這一段的設定呢?是因為資料庫有許多種類,如 SQL Server、Access、Oracle、DB2、MySQL等等,然而 VS.NET 並不知道您會使用哪一種的資料庫,所以就留給使用者來自行做決定
! 在 4-2-5節時就曾約略介紹了 DataGrid這個控制項,當中曾提及 DataGrid的資料來源常見的有兩種,一是 DataSet(前面章節已介紹過了),另一是SqlDataReader,也就是這個範例所使用到的技術, 將 DataGrid資料來源屬性 DataSource設定為 SqlDataReader的物件,最後再做個 DataBind(),就能夠將資料顯現在 DataGrid控制項上了。
6-9
6-10
!
ASP.NET網頁設計與 C#
! 執行畫面說明:
請在【VC6-1】專案上按滑鼠右鍵執行【建置】,以編譯檢查程式是否正確。若無錯誤產生則按【F5】開始執行程式,圖 6-6 畫面會呈現一個以 DataGrid控制項來顯示的資料查詢結果。
圖 6-6:執行結果畫面
範例 6-2:以 Insert新增資料庫記錄
本範例要利用 Insert語法,透過 ADO.NET技術在資料庫中新增一筆記錄,並以 DataGrid控制項將結果顯示出來。
! 步驟一:新增專案
請在 VS.NET 開發工具中新增一個專案,選擇 ASP.NET WEB應用程式,並命名為 VC6-2。
! 步驟二:版面配置
1. 如圖 6-7所示,從【工具箱】拖曳進一個 DataGrid控制項。
I 6 IASP.NET資料庫存取技術
圖 6-7:拖曳控制項
2. 調整 DataGrid控制項的大小及位置,如圖 6-8。
圖 6-8:設定 DataGrid 控制項
6-11
6-12
!
ASP.NET網頁設計與 C#
3. 設定 DataGrid控制項的格式化 請點選 DataGrid 控制項,再點選【屬性視窗】下面的【自動格式化】,選擇任一格式來美化 DataGrid,然後按【確定】按鈕結束(圖 6-9)。
圖 6-9:DataGrid 控制項的格式化
! 步驟三:建立程式碼
請點選【方案總管】視窗中的 WebForm1.aspx 程式,按滑鼠右鍵選取【檢視程式碼】(圖 6-10)。
I 6 IASP.NET資料庫存取技術
圖 6-10:檢視程式碼
之後會出現一個 WebForm1.aspx.cs的程式碼後置檔案(圖 6-11)。
圖 6-11:程式碼後置檔案
6-13
6-14
!
ASP.NET網頁設計與 C#
1. 先加入 using System.Data.SqlClient;命名空間,這是手動寫 SQL Server資料庫連線會用到的。
2. 這裡要在程式載入時,自動執行資料記錄的新增,接著並以 DataGrid來顯示新的資料記錄,請在 Page_Load程式區塊內加入程式碼,程式碼如下:
private void Page_Load(object sender, System.EventArgs e) { //新增㆒筆記錄 SqlConnection conn1=new SqlConnection("data source=localhost; initial catalog=myDB;user id=sa;password=12345"); conn1.Open(); SqlCommand cmd1=new SqlCommand("insert into product ProductID,ProductName,Quantity,Price) values ('M001','芒果汁' ,100,25)",conn1); cmd1.ExecuteNonQuery(); //以 DataGrid來顯示 SqlConnection conn2=new SqlConnection("data source=localhost; initial catalog=myDB;user id=sa;password=12345"); conn2.Open(); SqlCommand cmd2=new SqlCommand("select * from product",conn2); SqlDataReader dr=cmd2.ExecuteReader(); DataGrid1.DataSource=dr; DataGrid1.DataBind(); }